DLL dize işlevi Build 600'de çalışmıyor - sayfa 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] = "" ;
 }  }  }}
merhaba kodlayıcılar, bu MT4iQuickChannel.dll gönderen-alıcı mesajı örneğidir, mt4 v509'da çalıştı, ancak v600+'da çalışmıyor, sorunun yaklaşık 16bit unicode olduğunu biliyorum ama çözemiyorum, bu yüzden her vücut yapabilir bana yardım et?
 
bu koddur, iki MT'ye kurun, iki terminal ile iletişim kurmak için kullanın.
Dosyalar:
 
appleparty :
bu koddur, iki MT'ye kurun, iki terminal ile iletişim kurmak için kullanın.

Çok teşekkür ederim appleparty!
 

rica ederim, kod v600+'da çalışmıyor, bu yüzden bize sorunu nasıl çözeceğimizi söylerseniz, çok teşekkür ederim!

 

@gorick:

ORACLE DB'ye bağlanmak için harika bir iş! Ancak mql4 ile ORACLE'dan/ORACLE'a nasıl okur/yazarsınız?

Ve oraDLL.dll'yi nereden edindiniz?


THX peşin!


Michael

 

m.mick ile aynı sorularım var:

oraDLL.dll dosyasını nereden indirebilirim ve ORACLE-DB ile okuma ve yazma uygulaması nasıldır?

THX 4 bana yardım ediyor!

 
m.mick :

@gorick:

ORACLE DB'ye bağlanmak için harika bir iş! Ancak mql4 ile ORACLE'dan/ORACLE'a nasıl okur/yazarsınız?

Ve oraDLL.dll'yi nereden edindiniz?

THX peşin!

Michael

m.mick,

Verdiğim şey, Oracle Pro*C ön derleyicisini kullanan bir kod parçacığıdır. EXEC SQL CONNECT ile aynı. Aşağıdaki örneğe bakın. Kodu yazarsınız ve bunu, daha sonra işlev çağrılarında DLL'nizin bir parçası olarak derleyeceğiniz C kodunu üreten Oracle Pro*C ön derleyicisi aracılığıyla çalıştırırsınız. Bunun için Oracle'ı tanımanız, Oracle DB ve Client yazılımını edinmeniz, buna ön derleyiciler de dahil olmanız gerekir. Oracle'ı çok uzun zamandır kullanıyorum ve sırf alıştığım için diğerlerine tercih ediyorum.

İyi şanlar.

    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 ön derleyicisi, yerel API'si olan OCI - Oracle Çağrı Arayüzü'nü kullanarak Oracle'a arayüz oluşturmak için yukarıdakilerden C kodu üretir.

 
gorick :

m.mick,

Verdiğim şey, Oracle Pro*C ön derleyicisini kullanan bir kod parçacığıdır. EXEC SQL CONNECT ile aynı. Aşağıdaki örneğe bakın. Kodu yazarsınız ve bunu, daha sonra işlev çağrılarında DLL'nizin bir parçası olarak derleyeceğiniz C kodunu üreten Oracle Pro*C ön derleyicisi aracılığıyla çalıştırırsınız. Bunun için Oracle'ı tanımanız, Oracle DB ve Client yazılımını edinmeniz, buna ön derleyiciler de dahil olmanız gerekir. Oracle'ı çok uzun zamandır kullanıyorum ve sırf alıştığım için diğerlerine tercih ediyorum.

İyi şanlar.

Oracle Pro*C ön derleyicisi, yerel API'si olan OCI - Oracle Çağrı Arayüzü'nü kullanarak Oracle'a arayüz oluşturmak için yukarıdakilerden C kodu üretir.


Burada bulunan Oracle Instant Client'ın 32 bit sürümüne ihtiyacınız olacağını belirtmeyi unuttum: http://www.oracle.com/technetwork/topics/winsoft-085727.html, 64 bit MetaTrader platformuyla çalışmayacak . DB 64 bit sürüm olabilir. Oracle'ı bilmelisiniz, karmaşık bir yazılımdır. Ücretsiz olarak geliştirebilirsiniz, sadece Oracle ile bir kayıt oluşturmanız yeterlidir, kayıt olmak ücretsizdir. Tüm Oracle indirmeleri ücretsizdir.
 

gorik:

Evet haklısın, ORACLE karmaşık bir yazılımdır. ORACLE ile birkaç yıldan beri çalışıyorum (ancak yalnızca SQL ve PL/SQL), bu en iyi veritabanı. Ne yazık ki Pro*C Derleyici veya DLL'lerle geliştirmedim. Bu yüzden bunu yapmak benim için oldukça zor. Ama deneyeceğim! :-)

Harika çalışmanızla ilgili birkaç sorum var.

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

Derlemeye çalışırsam (Derleme 610), "diziler yalnızca referansla geçirilir" gibi hata mesajları alırım. Niye ya? Peki ne yapmalıyım? Neden string değil de uchar[] kullandınız? Belki Pro*C-Derleyici yüzünden?

DLL'yi nasıl geliştirdiniz? MT4 ile de mi? Meta düzenleyicide derledikten sonra bir *.ex4 Dosyası alıyorum.... .

.c dosyasını Pro*C ön derleyicisinden alırsam, o dosyayla ne yapmam gerekir? Bu kod parçasıyla bir DLL'yi nasıl geliştiririm veya oluştururum?


Oracle Instant Client, oraDLL'nin kullanılması gereken her istemci için zorunludur. Doğru?


THX peşin!!!

 

ORACLE Pro*C Derleyicisini kullanırsam, oluşturulan kodu dll'ye ekledikten sonra çok fazla hata alıyorum.

Dll'yi derledikten sonra bazı sorunlar:

- UNAME_LEN, PWD_LEN ve DBSTRING_LEN beyanı eksik

- EXPORT doğru kelime mi, bir hata alıyorum; extern doğru kelime değil mi?

- connect1 (ve 2 ve 3) farklı türlerdedir: char ** bildiriminde ve (strncpy) kullanımında yalnızca char *; ve kullanımdan kaldırıldı, strncpy_s kullanmalısınız

- sqlca bildirilmedi

-...


Biri lütfen bana yardım edebilir mi?


önceden THX,

Michael