A função de cadeia DLL não funciona no Build 600 - página 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] = "";
 }  }  }}
Olá, codificadores, aqui é MT4iQuickChannel.dll sender-receiver mensagem exemplo,funcionou em mt4 v509, mas não funciona em v600+,eu sei que o problema é cerca de 16bit unicode, mas não consigo resolvê-lo,então todo mundo pode me ajudar?
 
isto é código,instalar em duas MT,usar para comunicação com dois terminais.
Arquivos anexados:
 
appleparty:
isto é código,instalar em duas MT,usar para comunicação com dois terminais.

Muito obrigado appleparty!
 

você é welcome,the código não é trabalho em v600+, então se você pode nos dizer como resolver o problem,i quer muito obrigado much!

 

@gorick:

Grande trabalho para se conectar a um BD ORACLE! Mas como você lê/escreve de/para ORACLE com mql4?

E de onde você obteve o oraDLL.dll?


THX com antecedência!


Michael

 

Tenho as mesmas perguntas que m.mick:

Onde posso baixar oraDLL.dll e como é a implementação da leitura e da escrita com ORACLE-DB?

THX 4 me ajudando!

 
m.mick:

@gorick:

Grande trabalho para se conectar a um BD ORACLE! Mas como você lê/escreve de/para ORACLE com mql4?

E de onde você obteve o oraDLL.dll?

THX com antecedência!

Michael

m.mick,

O que eu dei é um trecho de código usando o pré-compilador Oracle Pro*C. O mesmo que o EXEC SQL CONNECT. Veja o exemplo abaixo. Você escreve o código e depois o executa através do pré-compilador Oracle Pro*C que produz o código C que você então compila como parte de sua DLL em chamadas de função. Você precisa conhecer a Oracle, obter o software Oracle DB e Client, incluindo os pré-compiladores para fazer isso. Eu uso oráculo há muito tempo e o prefiro a todos os outros, simplesmente porque estou acostumado a ele.

Boa sorte.

    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;

O pré-compilador Oracle Pro*C gera o código C do acima para fazer a interface Oracle usando a OCI - Oracle Call Interface, sua API nativa.

 
gorick:

m.mick,

O que eu dei é um trecho de código usando o pré-compilador Oracle Pro*C. O mesmo que o EXEC SQL CONNECT. Veja o exemplo abaixo. Você escreve o código e depois o executa através do pré-compilador Oracle Pro*C que produz o código C que você então compila como parte de sua DLL em chamadas de função. Você precisa conhecer a Oracle, obter o software Oracle DB e Client, incluindo os pré-compiladores para fazer isso. Eu uso oráculo há muito tempo e o prefiro a todos os outros, simplesmente porque estou acostumado a ele.

Boa sorte.

O pré-compilador Oracle Pro*C gera o código C do acima para fazer a interface Oracle usando a OCI - Oracle Call Interface, sua API nativa.


Esqueci de mencionar que você precisará da versão 32bit do Cliente Instantâneo Oracle, encontrada aqui: http://www.oracle.com/technetwork/topics/winsoft-085727.html, os 64 bits não funcionarão com a plataforma MetaTrader. O DB pode ser a versão de 64 bits. Você tem que conhecer o Oracle, é um software complexo. Você pode desenvolver gratuitamente, você só precisa criar um registro com Oracle, é gratuito. Todos os downloads do Oracle são gratuitos.
 

gorick:

Sim, você está certo, ORACLE é um software complexo. Trabalho com ORACLE há alguns anos (mas apenas SQL e PL/SQL), é o melhor banco de dados. Infelizmente eu não desenvolvi com Pro*C Compiler ou DLL's. Portanto, é bastante difícil para mim, fazer isto. Mas eu vou tentar! :-)

Tenho algumas perguntas a respeito de seu grande trabalho.

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

Se eu quiser compilá-lo (Build 610), receberei mensagens de erro como "os arrays são passados somente por referência". Por quê? E o que eu devo fazer? Por que você usou uchar[] e não string? Talvez por causa do Pro*C-Compilador?

Como você desenvolveu a DLL? Com o MT4 também? Eu recebo um *.ex4-File após a compilação no meta editor.... .

Se eu receber o arquivo .c do pré-compilador Pro*C, o que eu tenho a ver com esse arquivo? Como desenvolver ou gerar uma DLL com esse pedaço de código?


O Oracle Instant Client é obrigatório para cada cliente em que o oraDLL deve ser usado. Certo?


THX com antecedência!!!

 

Se eu usar o Compilador ORACLE Pro*C, receberei muitos erros depois de inserir o código gerado na dll.

Aqui estão alguns problemas após a compilação da dll:

- a declaração de UNAME_LEN, PWD_LEN e DBSTRING_LEN está faltando

- EXPORTAÇÃO é a palavra certa, eu receberei um erro; não é externo a palavra certa?

- connect1 (e 2 e 3) são de tipos diferentes: na declaração char ** e no uso (strncpy) somente char *; e é depricated, você deve usar strncpy_s

- sqlca não é declarada

- ...


Alguém pode, por favor, me ajudar?


THX com antecedência,

Michael