DLL字符串功能在Build 600上不起作用 - 页 2

 
gchrmt4:

模拟旧的Ansi字符串数组是混乱的,但仍然是可能的。(这将取决于DLL是否表现良好,特别是如果它通过改变数组的内容将数据传回 给MQL4。我只针对底部的C++示例代码进行了测试,而不是针对更现实的东西,如MySql库)。

例如,上面的代码与下面的DLL一起工作,它为数组中的每个字符串做一个消息框,然后在返回到MT4之前将字符串反转。


我只是无法解释你的片段有多大的帮助。非常感谢您!我已经在纯MQL4(UNICODE版本)中写 了一个MySQL包装器,使用你提到的技术和我在EAX MySQL库(MQL5)中发现的技术与libmysql.dll(ANSI)进行通信。

如果你能看一下我的代码,并让我知道 需要改进的地方或对它的贡献,我真的很感激,因为我确信它可以改进。

 

gchrmt4,

你能告诉我如何通过DLL函数调用 传递一个字符串吗,或者给我指出一些示例代码?

我想确认的是,我可以做这样的一个调用。

#import

int call_a_string_function(string this_is_a_string)。

#import

...

...

string foo1 = "this is a string";

int retruncode = call_a_string_function(foo1);

那么上述函数的C语言代码会是什么样子的?我只是在寻找常规的例子。

比如说

int call_a_string_function(char *this_is_a_string);

等等

有些人说要用数组或char数组等等。我希望得到一些澄清。只是一个简单的例子,因为你提到了内存泄漏等,所以最好的方法是什么?

问候

gorick

 
gorick:

gchrmt4,

你能告诉我如何通过DLL函数调用传递一个字符串吗,或者给我指出一些示例代码?

我想确认的是,我可以做这样的一个调用。

#import

int call_a_string_function(string this_is_a_string)。

#import

...

...

string foo1 = "this is a string";

int retruncode = call_a_string_function(foo1);

那么上述函数的C语言代码会是什么样子的?我只是在寻找常规的例子。

比如说

int call_a_string_function(char *this_is_a_string);

等等

有些人说要用数组或char数组等等。我希望得到一些澄清。只是一个简单的例子,因为你提到了内存泄漏等,所以最好的方法是什么?

问候

gorick

见本文https://www.mql5.com/en/articles/18
 

是的,对此表示感谢。介绍得真好,也是我所期望的。然而,我似乎在字符串方面遇到了问题。

我从该文件中用C语言创建了一个样本,例如下面,接受一个字符串值作为输入,并将其写入一个文件。

#define  WIN32_LEAN_AND_MEAN
#include <windows.h>

#define  EXPORT extern "C" __declspec (dllexport)

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
EXPORT void __stdcall GetStringValue(wchar_t *spar)
{
char abc[20];
strcpy(abc,"foooooooooooo1");
printf("GetStringValue \"%s\"\n",spar);
FILE *fp;
fp=fopen("fooerr.txt", "w");
fprintf(fp, "These are the string values: %s %s\n\n", spar, abc);
fclose(fp);
}

我把数值写到一个文件里来检查

MQL如下。

 #property indicator_chart_window

#include <stderror.mqh>
#include <stdlib.mqh>

#import "myDLL.dll"

void GetStringValue(string instring);

#import

int init()
{

string instring = "Rick wrote this";

GetStringValue(instring);

return(0);
} // init

文件的输出如下。

这些是字符串的值。R foooooooooo1

它只返回 "R "或传递的字符串的第一个字符?插入 "foooooooooo1 "只是为了检查我的打印是否正确。

有没有人知道我做错了什么?

 
gorick:

是的,对此表示感谢。介绍得真好,也是我所期望的。然而,我似乎在字符串方面遇到了问题。

我从该文件中用C语言创建了一个样本,例如下面,接受一个字符串值作为输入,并将其写入一个文件。

<移除>。

请使用 SRC按钮 来发布代码。. .
 
gorick:

有没有人知道我做错了什么?

问题出在你的C语言代码中,而不是在MQL4中。

printf()中的%s指的是 "Ansi字符串"。你需要使用%ls

 
gorick:

是的,对此表示感谢。介绍得真好,也是我所期望的。然而,我似乎在字符串方面遇到了问题。

我从该文件中用C语言创建了一个样本,例如下面,接受一个字符串值作为输入,并将其写入一个文件。

我把数值写到一个文件中进行检查。

MQL如下。

文件的输出如下。

这些是字符串的值。R foooooooooo1

它只返回 "R "或传递的字符串的第一个字符?插入 "foooooooooo1 "只是为了检查我的打印是否正确。

有没有人知道我做错了什么?


你好。

当你发布代码时,请使用SRC按钮。谢谢你。


这一次,我为你编辑了它。

 
angevoyageur:

你好。

当你发布代码时,请使用SRC按钮。谢谢你。


这一次,我为你编辑了它。


对不起各位,我真的是第一次在这里发帖。

谢谢你的意见,我真的很感激。

这意味着所有现有的样本都是不准确的。人们必须使用unicode。由于我对DLL的编程非常陌生,最近才从头开始,所以我在很大程度上依赖于所给的样本。 另外,我碰巧在同一时间开始使用600构建。

如果你已经做了很长时间,我想你是完全了解这种情况的。不幸的是,我没有,只是在这个论坛上得到一些信息和建议的片段。

我为我的无知感到抱歉。

问候和感谢

 
人们。

因为你们都帮助过我,所以我很乐意分享我的代码,它与Oracle数据库进行了连接。

问题是,Oracle Pro*C预编译器和oracle可以处理unicode,但是在构造的使用上有一些限制。要登录,字符串必须是ascii。下面是通过DLL调用登录到数据库的代码。

如果有人对如何做得更好有任何建议,请让我知道。

我再次感谢你们。

EXPORT int  __stdcall oracle_connect(char *connect1[], char *connect2[], char *connect3[])
{
   EXEC SQL BEGIN DECLARE SECTION;
   VARCHAR     username[UNAME_LEN];  /* VARCHAR is an Oracle-supplied struct */
   varchar     password[PWD_LEN];    /* varchar can be in lower case also. */
   varchar     dbstring[DBSTRING_LEN];
   EXEC SQL END DECLARE SECTION;

   /* Connect to ORACLE--
    * Copy the username into the VARCHAR.
    * Set the length component of the VARCHAR.
    
    strncpy((char *) username.arr, connect1, UNAME_LEN);
    username.len = strlen((char *) username.arr);
    strncpy((char *) password.arr, connect2, PWD_LEN);
    password.len = strlen((char *) password.arr);
    strncpy((char *) dbstring.arr, connect3, DBSTRING_LEN);
    dbstring.len = strlen((char *) dbstring.arr);
        
        EXEC SQL WHENEVER SQLERROR DO return(sqlca.sqlcode);
        EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbstring; 

/*    printf("\n\nConnected to ORACLE as user: %s\n", username.arr); */

    return(0);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

MQL4 code

#import "oraDLL.dll"
   int    oracle_connect(uchar user_name[], uchar user_pwd[], uchar db_service[]);
#import

extern string DBusername = "scott";
extern string DBpassword = "tiger";
extern string DBservice = "localhost/pdborcl";

int returncode;

int init()
{
  uchar user_name[], user_pwd[], db_service[];
  StringToCharArray(DBusername,user_name);
  StringToCharArray(DBpassword,user_pwd);
  StringToCharArray(DBservice,db_service);
  returncode = oracle_connect(user_name,user_pwd,db_service);
  Print("returncode = " + returncode);
}

 
gorick:
人们。

因为你们都帮助过我,所以我很乐意分享我的代码,它与Oracle数据库进行了连接。

问题是,Oracle Pro*C预编译器和oracle可以处理unicode,但是在构造的使用上有一些限制。要登录,字符串必须是ascii。下面是通过DLL调用登录到数据库的代码。

如果有人对如何做得更好有任何建议,请让我知道。

我再次感谢你们。

非常感谢gorkk!