MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 1177

 
Alexey Viktorov :

Dizeyi #define str "long long string " olarak veya hatta + veya bir string işlevi aracılığıyla iki dize olarak kaydırmaya çalışmak yerine.

Sonuçta Yorum satırın uzunluğunda da sınırlıdır, ancak o kadar çok değişken koyabilirsiniz ki monitöre sığmaz birkaç satırda.

Teşekkürler, kısaltma gerçekten işe yarıyor, derleyici gerçekten anlıyor, ancak @ ile dekore edilmiş işlevleri (sanırım buna denir) kabul etmiyor. Ve eski derleyici bu tür işlevleri kabul eder, ancak tam anlamıyla alarak içe aktarmak için ikame eklemez. İşlevleri dll belgelerindeki gibi içe aktarırsanız, yani. "TRANS2QUIK_CONNECT" ve " _TRANS2QUIK_CONNECT@16" değil, 2(TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND) döndürür. Ne farkı var anlamadım.
 
f1nik :
Teşekkürler, azaltma gerçekten işe yarıyor, derleyici gerçekten anlıyor, ancak @ ile dekore edilmiş işlevleri (sanırım buna öyle diyorlar) kabul etmiyor. Ve eski derleyici bu tür işlevleri kabul eder, ancak tam anlamıyla alarak içe aktarmak için ikame eklemez. İşlevleri dll belgelerindeki gibi içe aktarırsanız, yani. "TRANS2QUIK_CONNECT" ve " _TRANS2QUIK_CONNECT@16" değil, 2(TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND) döndürür. Ne farkı var anlamadım.
Dll dosyasını bir hex düzenleyicide açın , biraz inceleyin ve giriş noktalarının adlarını sembolik olarak görün. Veya bunu sizin için yapacak bir tür dll Explorer bulun, aynı zamanda bağımlılıkları da gösterecektir.

Bu arada, işe yarayacağı bir gerçek değil, eğer giriş noktaları stdcall değilse, conta olmadan yapamazsınız.
 
f1nik :
Teşekkürler, azaltma gerçekten işe yarıyor, derleyici gerçekten anlıyor, ancak @ ile dekore edilmiş işlevleri (sanırım buna öyle diyorlar) kabul etmiyor. Ve eski derleyici bu tür işlevleri kabul eder, ancak tam anlamıyla alarak içe aktarmak için ikame eklemez. İşlevleri dll belgelerindeki gibi içe aktarırsanız, yani. "TRANS2QUIK_CONNECT" ve " _TRANS2QUIK_CONNECT@16" değil, 2(TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND) döndürür. Ne farkı var anlamadım.

Bununla ilgili belgelerde nerede yazıyor bilmiyorum ama dizedeki özel karakterden önce bir eğik çizgi olmalı. Bu nedenle, örneğin adres dizesi şöyle görünmelidir: С:\\klasör\\dosya

Yani şöyle yazmayı deneyin: " _TRANS2QUIK_CONNECT\@16"

Genel olarak, .dll ile arkadaş değilim. Bu işe yaramazsa, o zaman...

 

@Maxim Kuznetsov dll'yi WinHex ve Dependency Walker'da açtı, Sıralama, İpucu, İşlev, Giriş Noktası veriyor ve ( _TRANS2QUIK_CONNECT@16) gibi işlevlerin adlarını veren oydu.   eski derleyici onlarla birlikte çalışır ve sonuç dll'sini geri verir. Bu sembolik isimlerden mi bahsediyorsunuz?

@Alexey Viktorov Ben kendim programlamada bir meslekten değilim, ancak daha önce fikirlerimi yapmak için mütevazı bir bilgi yeterliydi. Kaçış \\ başarısız olur.

Python'da otomatik bir proxy dll oluşturucu bulundu https://github.com/mavenlin/Dll_Wrapper_Gen . Aslında benim için birleştirilmiş dll'deki sadece fonksiyonların isimlerini değiştirmenin uygun olduğunu düşündüm. Değişiklik yapmadan derlemeye çalıştım, derleyici işlev adlarında @'ye yemin ediyor. Oluşturulan cpp parçası

 #include <windows.h>
#include <stdio.h>
HINSTANCE mHinst = 0 , mHinstDLL = 0 ;
UINT_PTR mProcs[ 68 ] = { 0 };

LPCSTR mImportNames[] = { "_TRANS2QUIK_CONNECT@16" };
BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved ) {
        mHinst = hinstDLL;
         if ( fdwReason == DLL_PROCESS_ATTACH ) {
                mHinstDLL = LoadLibrary( "ori_TRANS2QUIK.dll" );
                 if ( !mHinstDLL )
                         return ( FALSE );
                 for ( int i = 0 ; i < 68 ; i++ )
                        mProcs[ i ] = (UINT_PTR)GetProcAddress( mHinstDLL, mImportNames[ i ] );
        } else if ( fdwReason == DLL_PROCESS_DETACH ) {
                FreeLibrary( mHinstDLL );
        }
         return ( TRUE );
}

extern "C" __declspec(naked) void __stdcall _TRANS2QUIK_CONNECT@ 16 _wrapper(){__asm{jmp mProcs[ 0 * 4 ]}}

Oluşturulan def dosyasının parçası

LIBRARY TRANS2QUIK.dll
EXPORTS
        _TRANS2QUIK_CONNECT@ 16 =_TRANS2QUIK_CONNECT@ 16 _wrapper @ 1

_TRANS2QUIK_CONNECT@ 16 _wrapper'ın proxy dll'sinden görünecek işlevlerin adı olduğunu anlıyorum. Bu nedenle, CONNECT olarak kısalttım. Dll oluşturuldu ancak terminal TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND gösteriyor. Beynime uymuyor gibi. Ticaret sistemini manuel olarak kontrol etmeniz ve ardından dll'yi sipariş etmeniz gerekecektir.

 
f1nik :

@Maxim Kuznetsov dll'yi WinHex ve Dependency Walker'da açtı, Sıralama, İpucu, İşlev, Giriş Noktası veriyor ve ( _TRANS2QUIK_CONNECT@16) gibi işlevlerin adlarını veren oydu.   eski derleyici onlarla birlikte çalışır ve sonuç dll'sini geri verir. Bu sembolik isimlerden mi bahsediyorsunuz?

@Alexey Viktorov Ben kendim programlamada bir meslekten değilim, ancak daha önce fikirlerimi yapmak için mütevazı bir bilgi yeterliydi. Kaçış \\ başarısız olur.

Python'da otomatik bir proxy dll oluşturucu bulundu https://github.com/mavenlin/Dll_Wrapper_Gen . Aslında benim için birleştirilmiş dll'deki sadece fonksiyonların isimlerini değiştirmenin uygun olduğunu düşündüm. Görsel stüdyo için bir proje yaptı. Değişiklik yapmadan derlemeye çalıştım, derleyici işlev adlarında @'ye yemin ediyor. Oluşturulan cpp parçası

Oluşturulan def dosyasının parçası

_TRANS2QUIK_CONNECT@ 16 _wrapper'ın proxy dll'sinden görünecek işlevlerin adı olduğunu anlıyorum. Bu nedenle, CONNECT olarak kısalttım. Dll oluşturuldu ancak terminal TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND gösteriyor. Beynime uymuyor gibi. Ticaret sistemini manuel olarak kontrol etmeniz ve ardından dll'yi sipariş etmeniz gerekecektir.

Bunca zamandır terminalin ve DLL'nin bit derinliği hakkında tek kelime etmediniz. Ve önemli mi?

 

@Koldun Zloy Trans2QuikAPI_1.2'yi denedi , mt4 ve quik 7 ile 32 bit ve ayrıca mt5 ve quik 8 ile Trans2QuikAPI_1.3_x64, sadece 64 bit gibi. Hızlı olarak, harici işlemleri etkinleştirdim. İşlevi doğru şekilde içe aktarmadığımı düşündüm. kendim yazdım

 int _TRANS2QUIK_CONNECT@ 16 ( string lpcstrConnectionParamsString, int & pnExtendedErrorCode[], string lpstrErrorMessage, int dwErrorMessageSize);
В новом компиляторе mt4 можно только так

int _TRANS2QUIK_CONNECT( string lpcstrConnectionParamsString, int & pnExtendedErrorCode[], string lpstrErrorMessage, int dwErrorMessageSize);
В h файле который есть в архиве с dll написано так long TRANS2QUIK_API __stdcall TRANS2QUIK_CONNECT (LPSTR lpstConnectionParamsString,long* pnExtendedErrorCode, LPSTR lpstrErrorMessage, DWORD dwErrorMessageSize);

Eşdeğer veri türleri gibi. Sonuçta, doğru olmasaydı, bence öyle, eski derleyici ile çalışmayacaktı.

 
Genelde dll'yi bağladığı ortaya çıktı. Önce dekore edilmiş bir işlevi ( _TRANS2QUIK_CONNECT@ 16 ) çağırırsanız, en az iki dekore edilmemiş işlev çalışır. Cevap veren herkese teşekkürler.
 
MT5'te test hızı programlı olarak nasıl kontrol edilir? Kılavuz, test cihazında Sleep() 'in kullanılmaması gerektiğini açıkça belirtmiyor, ancak işe yaramıyor gibi görünüyor...
Belirli bir anda test hızının düşmesi gerekir. Tüm o anları elle yakalamak zor...
 
Merhaba! MQL5'te arka plan ve butonlardan oluşan bir panel oluşturdum . Panel sürüklenirken sadece arka plan hareket eder, butonlar yerinde kalır ve sadece bir sonraki tıklamada butonlar arka planın arkasından doğru yere hareket eder. Lütfen bana düğmelerin ve arka planın aynı anda nasıl hareket ettirileceğini söyle. Şimdiden teşekkür ederim!
 
Mikhail :
Merhaba! MQL5'te arka plan ve butonlardan oluşan bir panel oluşturdum. Panel sürüklenirken sadece arka plan hareket eder, butonlar yerinde kalır ve sadece bir sonraki tıklamada butonlar arka planın arkasından doğru yere hareket eder. Lütfen bana düğmelerin ve arka planın aynı anda nasıl hareket ettirileceğini söyle. Şimdiden teşekkür ederim!

Bir test cihazından mı bahsediyorsunuz yoksa çevrimiçi mi?

çevrimiçiyse - move olayının normal şekilde iletilmediği koda bakın. Bu arada sitede sadece beş farklı kütüphane var, neden bahsediyorsunuz?

Ve test cihazında - hiçbir şekilde görünmüyor ve neden.