DLL dize işlevi Build 600'de çalışmıyor - sayfa 2

 
gchrmt4 :

Eski Ansi dize dizilerini simüle etmek dağınıktır, ancak yine de mümkündür. (Bu, özellikle dizinin içeriğini değiştirerek verileri MQL4'e geri iletirse, DLL'nin iyi durumda olmasına bağlı olacaktır. Bunu daha gerçekçi bir şeye karşı değil, yalnızca alttaki örnek C++ koduna karşı test ettim. MySql kütüphanesi gibi.)

Örneğin, yukarıdaki kod, bir dizideki her dize için bir mesaj kutusu yapan ve ardından MT4'e dönmeden önce dizeyi tersine çeviren aşağıdaki DLL ile çalışır:


Snippet'lerinizin ne kadar yararlı olduğunu açıklayamam. Çok teşekkür ederim! Devam ettim ve bahsettiğiniz teknikleri ve EAX MySQL kitaplığında (MQL5) bulduğum teknikleri kullanarak libmysql.dll (ANSI) ile iletişim kuran saf MQL4'te (UNICODE sürümü için) bir MySQL sarıcı yazdım.

Oradaki koduma bir göz atabilir ve geliştirilebileceğinden oldukça emin olduğum için iyileştirebileceğim veya katkıda bulunabileceğim şeyler hakkında bana bilgi verebilirseniz gerçekten minnettar olurum.

 

gchrmt4,

Lütfen bana bir DLL işlev çağrısı yoluyla bir dizeyi nasıl geçirebileceğimi gösterebilir veya beni bir örnek koda yönlendirebilir misiniz?

Aradığım şey, aşağıdaki gibi bir arama yapabileceğime dair onay:

#içe aktarmak

int call_a_string_function(string this_is_a_string);

#içe aktarmak

...

...

string foo1 = "bu bir string";

int retruncode = call_a_string_function(foo1);

o zaman yukarıdaki fonksiyon için C kodu nasıl görünür? Ben sadece rutin örneği arıyorum.

Örneğin

int call_a_string_function(char *this_is_a_string);

vb

Bazı insanlar bir dizi veya karakter dizisi vb. kullanmamızı söylüyor. Biraz açıklama arıyorum. Bellek sızıntısından vb. bahsettiğiniz gibi en iyi yaklaşımla ilgili basit bir örnek.

Saygılarımızla

gorik

 
gorick :

gchrmt4,

Lütfen bana bir DLL işlev çağrısı yoluyla bir dizeyi nasıl geçirebileceğimi gösterebilir veya beni bir örnek koda yönlendirebilir misiniz?

Aradığım şey, aşağıdaki gibi bir arama yapabileceğime dair onay:

#içe aktarmak

int call_a_string_function(string this_is_a_string);

#içe aktarmak

...

...

string foo1 = "bu bir string";

int retruncode = call_a_string_function(foo1);

o zaman yukarıdaki fonksiyon için C kodu nasıl görünür? Ben sadece rutin örneği arıyorum.

Örneğin

int call_a_string_function(char *this_is_a_string);

vb

Bazı insanlar bir dizi veya karakter dizisi vb. kullanmamızı söylüyor. Biraz açıklama arıyorum. Bellek sızıntısından vb. bahsettiğiniz gibi en iyi yaklaşımla ilgili basit bir örnek.

Saygılarımızla

gorik

Bu makaleye bakın https://www.mql5.com/en/articles/18
 

Evet, bunun için teşekkürler. Gerçekten iyi sunulmuş ve beklediğim. Ancak, dizelerle ilgili sorunlarım var gibi görünüyor.

Girdi olarak bir dize değerini kabul etmek ve bir dosyaya yazmak için C'deki bu belgeden bir örnek oluşturdum, örneğin aşağıda:

 #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);
}

Değerleri kontrol etmek için bir dosyaya yazarım.

MQL aşağıdaki gibidir:

 #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

Dosya çıktısı aşağıdaki gibidir:

Bunlar dize değerleridir: R fooooooooooo1

Yalnızca iletilen dizenin "R" veya ilk karakterini mi döndürür? "fooooooooooooo1", yalnızca doğru yazdırıp yazdırmadığımı kontrol etmek için eklendi.

Neyi yanlış yaptığım hakkında bir fikri olan var mı?

 
gorick :

Evet, bunun için teşekkürler. Gerçekten iyi sunulmuş ve beklediğim. Ancak, dizelerle ilgili sorunlarım var gibi görünüyor.

Girdi olarak bir dize değerini kabul etmek ve bir dosyaya yazmak için C'deki bu belgeden bir örnek oluşturdum, örneğin aşağıda:

<kaldırıldı>

Lütfen kodu göndermek için SRC düğmesini kullanın. . .
 
gorick :

Neyi yanlış yaptığım hakkında bir fikri olan var mı?

Sorun MQL4'te değil, C kodunuzda.

printf() içindeki %s, "Ansi dizesi" anlamına gelir. %ls kullanmanız gerekiyor

 
gorick :

Evet, bunun için teşekkürler. Gerçekten iyi sunulmuş ve beklediğim. Ancak, dizelerle ilgili sorunlarım var gibi görünüyor.

Girdi olarak bir dize değerini kabul etmek ve bir dosyaya yazmak için C'deki bu belgeden bir örnek oluşturdum, örneğin aşağıda:

Değerleri kontrol etmek için bir dosyaya yazarım.

MQL aşağıdaki gibidir:

Dosya çıktısı aşağıdaki gibidir:

Bunlar dize değerleridir: R fooooooooooo1

Yalnızca iletilen dizenin "R" veya ilk karakterini mi döndürür? "fooooooooooooo1", yalnızca doğru yazdırıp yazdırmadığımı kontrol etmek için eklendi.

Neyi yanlış yaptığım hakkında bir fikri olan var mı?


Merhaba,

Lütfen kod gönderirken SRC butonunu kullanın. Teşekkür ederim.


Bu sefer sizin için düzenledim.

 
angevoyageur :

Merhaba,

Lütfen kod gönderirken SRC butonunu kullanın. Teşekkür ederim.


Bu sefer sizin için düzenledim.


Üzgünüm çocuklar, burada yayınlamak için gerçekten yeni.

Katkınız için teşekkürler, gerçekten minnettarım.

Bunun anlamı, mevcut tüm örneklerin doğru olmadığıdır. Biri unicode kullanmak zorunda. DLL'leri programlamada çok yeni olduğum için yeni başladım, bu yüzden verilen örneklere büyük ölçüde güvendim. Ayrıca 600 yapıyı aynı anda kullanmaya başladım.

Bunu uzun süredir yapıyorsanız, durumun tamamen farkında olduğunuzu hayal ediyorum. Ne yazık ki değilim, bu forumda sadece bilgi ve tavsiye parçaları alıyorum.

Cahilliğim için özür dilerim.

saygılar ve teşekkürler

 
İnsanlar,

Hepiniz bana yardım ettiğiniz için Oracle DB ile bağlantı kuran kodumu paylaşmaktan mutluluk duyuyorum.

Sorun, Oracle Pro*C ön derleyicisinin ve Oracle'ın unicode'u işleyebilmesidir, ancak yapıların nerede kullanılabileceğine ilişkin sınırlamalar vardır. Oturum açmak için dizelerin ascii olması gerekir. Bir DLL çağrısından DB'ye giriş yapmak için gereken kod aşağıdadır.

Neyin daha iyi yapılacağına dair herhangi bir önerisi olan varsa lütfen bana bildirin.

tekrar teşekkür ederim.

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 :
İnsanlar,

Hepiniz bana yardım ettiğiniz için Oracle DB ile bağlantı kuran kodumu paylaşmaktan mutluluk duyuyorum.

Sorun, Oracle Pro*C ön derleyicisinin ve Oracle'ın unicode'u işleyebilmesidir, ancak yapıların nerede kullanılabileceğine ilişkin sınırlamalar vardır. Oturum açmak için dizelerin ascii olması gerekir. Bir DLL çağrısından DB'ye giriş yapmak için gereken kod aşağıdadır.

Neyin daha iyi yapılacağına dair herhangi bir önerisi olan varsa lütfen bana bildirin.

tekrar teşekkür ederim.

çok teşekkür ederim gork !
Neden: