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

 
#import "MT4iQuickChannel.dll"
   int QC_StartSender(string);
   int QC_ReleaseSender(int);
   int QC_SendMessage(int SenderHandle, string Message, int Flags);
#import

#import "kernel32.dll"
   void OutputDebugStringW(string msg);
#import

extern string  ChannelName = "QuickChannelTest";
extern bool    LogMessagesToDbgView = true;
int glbHandle = 0;

void init()
{
   glbHandle = QC_StartSender(ChannelName);
   if (glbHandle == 0) {
      Alert("Failed to get a QuickChannel sender handle");
   }
}

void deinit()
{
   QC_ReleaseSender(glbHandle);
   glbHandle = 0;
}

void start()
{
   if (glbHandle != 0) {
      string strMsg = StringConcatenate("我的天哪"  ,TimeToStr(TimeLocal(), TIME_SECONDS), ": " , Symbol() , "," , DoubleToStr(Bid, MarketInfo(Symbol(), MODE_DIGITS)) , "," , DoubleToStr(Ask, MarketInfo(Symbol(), MODE_DIGITS)));
      if (LogMessagesToDbgView) OutputDebugStringW("Message " + strMsg);
      int result = QC_SendMessage(glbHandle, strMsg, 0);
      if (result == 0) Alert("QuickChannel message failed");
      printf(strMsg);
   }     
}   
#import "MT4iQuickChannel.dll"
   int QC_StartReceiver(string, int);
   int QC_ReleaseReceiver(int);
   int QC_GetMessages3(int, string & arr[], int);
#import

#import "kernel32.dll"
   void OutputDebugStringW(string msg);
#import

extern string  ChannelName = "QuickChannelTest";
extern bool    LogMessagesToDbgView = true;

int glbHandle = 0;
string glbReceiveBuffer = "";

void init()
{
   glbReceiveBuffer = "12345678";
   for (int i = 0; i < 4; i++) glbReceiveBuffer = StringConcatenate(glbReceiveBuffer, glbReceiveBuffer);   
}

void deinit()
{
   QC_ReleaseReceiver(glbHandle);
   glbHandle = 0;
}

void start()
{

   if (glbHandle == 0) {
      glbHandle = QC_StartReceiver(ChannelName, WindowHandle(Symbol(), Period()));
   
      if (glbHandle == 0) {
         Alert("Failed to get a QuickChannel receiver handle");
      }
   }

   if (glbHandle != 0) {
      string arrBuffer[1];
      arrBuffer[0] = StringConcatenate(glbReceiveBuffer, ""); // Use copy of buffer template
      int res = QC_GetMessages3(glbHandle, arrBuffer, StringLen(arrBuffer[0]));
      
      if (res == 2) {
         Alert("QuickChannel buffer is not large enough!");
                     
      } else if (res == 1) {
               
      } else {
         string strMsgList = arrBuffer[0];

         if (strMsgList != "") {
         
            string Messages[];
            StringSplit(strMsgList, "\t", Messages);
         
            for (int i = 0; i < ArraySize(Messages); i++) {
               string strMsg = Messages[i];

               if (LogMessagesToDbgView) OutputDebugStringW("..." + strMsg);
         
               Comment(strMsg);
               Print(strMsg);
 }  }  } }}   

void StringSplit(string InputString, string Separator, string & ResultArray[])
{
   ArrayResize(ResultArray, 0);
   
   int lenSeparator = StringLen(Separator), NewArraySize;
   while (InputString != "") {
      int p = StringFind(InputString, Separator);
      if (p == -1) {
         NewArraySize = ArraySize(ResultArray) + 1;
         ArrayResize(ResultArray, NewArraySize);      
         ResultArray[NewArraySize - 1] = InputString;
         InputString = "";
      } else {
         NewArraySize = ArraySize(ResultArray) + 1;
         ArrayResize(ResultArray, NewArraySize);      
         ResultArray[NewArraySize - 1] = StringSubstr(InputString, 0, p);
         InputString = StringSubstr(InputString, p + lenSeparator);
         if (InputString == "") {
            ArrayResize(ResultArray, NewArraySize + 1);      
            ResultArray[NewArraySize] = "";
 }  }  }}
嗨,编码员,这是MT4iQuickChannel.dll发送-接收信息的例子,它在MT4 v509中工作,但在v600+中不工作,我知道问题是关于16位unicode,但我不能解决它,所以每个人都能帮助我吗?
 
这是代码,安装在两个MT上,用于与两个终端 通信。
附加的文件:
 
appleparty:
这是代码,安装到两个MT中,用于与两个终端进行通信。

非常感谢appleparty!
 

不客气,这段代码在v600+中不工作,所以如果你能告诉我们如何解决这个问题,我想非常感谢你!。

 

@gorick:

连接到ORACLE数据库的工作很好!但是你是如何用mql4从ORACLE读/写的?

你从哪里得到oraDLL.dll的?


先谢谢你!


俞敏洪

 

我有和m.mick一样的问题。

我在哪里可以下载oraDLL.dll,用ORACLE-DB读写的实现方式是怎样的?

谢谢你对我的帮助!

 
m.mick:

@gorick:

连接到ORACLE数据库的工作很好!但是你是如何用mql4从ORACLE读/写的?

你从哪里得到oraDLL.dll的?

预祝你成功!

Michael

m.mick,

我所给出的是一个使用Oracle Pro*C预编译器的代码片段。与EXEC SQL CONNECT相同。请看下面的例子。你写好代码,然后通过Oracle Pro*C预编译器运行,产生C代码,然后将其编译为DLL中的函数调用 的一部分。你需要了解甲骨文,获得甲骨文数据库和客户端软件,包括预编译器来做这件事。我已经使用oracle很长时间了,比起其他所有的软件,我更喜欢它,只是因为我已经习惯了它。

祝您好运。

    EXEC SQL WHENEVER NOT FOUND DO sql_error("ORACLE error--\n");

    EXEC SQL SELECT 'Col1', 'Col2'
             INTO :stringrec INDICATOR :string_ind /* note insert into array variable */
             FROM    dual
             WHERE   :bindval1 = :bindval1
             AND     :string1 = :string1;

Oracle Pro*C预编译器 上述内容 生成C代码,使用 OCI--Oracle调用接口,即它的本地API与Oracle对接

 
gorick:

m.mick,

我所给出的是一个使用Oracle Pro*C预编译器的代码片段。与EXEC SQL CONNECT相同。请看下面的例子。你写好代码,然后通过Oracle Pro*C预编译器运行,生成C代码,然后将其编译为DLL中的函数调用的一部分。你需要了解甲骨文,获得甲骨文数据库和客户端软件,包括预编译器来做这件事。我已经使用oracle很长时间了,比起其他所有的软件,我更喜欢它,只是因为我已经习惯了它。

祝您好运。

Oracle Pro*C预编译器 上述内容 生成C代码,使用 OCI--Oracle调用接口,即它的本地API来连接 Oracle。


我忘了说,你将需要32位的Oracle即时客户端,在这里可以找到:http://www.oracle.com/technetwork/topics/winsoft-085727.html,64位的将不能在MetaTrader平台上使用。DB可以是64位的版本。你必须了解Oracle,它是一个复杂的软件。你可以免费开发,你只需要在Oracle创建一个注册,注册是免费的。所有的Oracle下载都是免费的。
 

戈里克。

是的,你是对的,ORACLE是一个复杂的软件。我从几年前就开始使用ORACLE了(但只是SQL和PL/SQL),它是最好的数据库。不幸的是,我没有使用Pro*C编译器或DLL的开发。所以对我来说,要做到这一点是相当困难的。但我要试试!:-)

我有几个关于你的伟大工作的问题。

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

如果我试图编译(Build 610)它,我将收到诸如 "数组仅通过引用传递 "的错误信息。为什么?我应该怎么做?为什么你用ucar[]而不是字符串?也许是因为Pro*C-Compiler的关系?

你是如何开发DLL的?也是用MT4吗?在meta editor.... 中编译后,我收到了一个*.ex4-文件.

如果我从Pro*C预编译器中收到.c文件,我应该如何处理该文件?我如何用这段代码开发或生成一个DLL?


Oracle Instant Client 是每个使用 oraDLL 的客户必须使用的。对吗?


预先感谢!!!。

 

如果我使用ORACLE Pro*C编译器,在将生成的代码插入dll后会出现很多错误。

下面是编译dll后的一些问题。

- UNAME_LEN、PWD_LEN和DBSTRING_LEN的声明丢失了

-EXPORT 这个词对吗,我会得到一个错误;extern这个词不对吗?

- connect1(还有2和3)是不同的类型:在声明中是char **,在使用中(strncpy)是char *;而且它是被贬低的,你应该使用strncpy_s

- sqlca没有被声明

- ...


谁能帮帮我?


谢谢。

尊敬的各位领导