新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1177

 
Alexey Viktorov:

你有没有试过把一个字符串滑成#define str "longlong string",甚至是通过+或string函数滑成两个字符串。

毕竟,Comment在字符串的长度上也是有限制的,但变量可以塞得很满,以至于在显示器上装不下几行。

谢谢,这个速记法确实有效,编译器确实能理解,但不接受带@的解码函数(我想这是它的名字)。而旧的编译器接受这样的函数,但并没有把它添加到导入替换中,而是从字面上看。如果我像dll文档中那样导入函数,即 "TRANS2QUIK_CONNECT "而不是"_TRANS2QUIK_CONNECT@16",则返回2(TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND)。我不明白其中的区别。
 
f1nik:
谢谢,的确是速记法,编译器确实能理解,但不接受带@的解码函数(我想这是它的名字)。而旧的编译器接受这样的函数,但不增加到导入替换中去,从字面上看是这样的。如果我像dll文档中那样导入函数,即 "TRANS2QUIK_CONNECT "而不是"_TRANS2QUIK_CONNECT@16",则返回2(TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND)。我不明白其中的区别。
在十六进制编辑器中打开 dll文件,浏览一下,你可以看到入口点的符号名称。或者找到一些可以为你做这件事的dll资源管理器,并同时显示依赖性。

顺便说一下,不确定它是否能工作,如果输入点不是stdcall,就不能不加填充。
 
f1nik:
谢谢,减法确实有效,编译器确实理解,但不接受带@的解码函数(我想这是它的名字)。而旧的编译器接受这样的函数,但不增加到导入替换中,从字面上看是这样的。如果我像dll文档中那样导入函数,即 "TRANS2QUIK_CONNECT "而不是"_TRANS2QUIK_CONNECT@16",则返回2(TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND)。我不明白其中的区别。

我不知道文档中哪里有这么说,但通配符前面必须有一个斜线。这就是为什么地址行应该看起来像这样:C:\folder\file

所以试着这样写:"_TRANS2QUIK_CONNECT\@16"

实际上,我对.dlls不是很在行。因此,如果这不起作用,那么...

 

@Maxim Kuznetsov 我在WinHex和Dependency Walker中打开了dll,它生成了Ordinal、Hint、Function、Entry Point,它生成了像(_TRANS2QUIK_CONNECT@16 这样的函数名称,有了它们,老的编译器就能工作,并返回dll结果。你是指这些象征性的名字吗?

@Alexey Viktorov 我自己也不是编程专家,但我不多的知识足以处理我的想法。Shielding\ does not work.

在python中发现自动代理dll生成器 https://github.com/mavenlin/Dll_Wrapper_Gen 。我认为这对我来说是有效的,基本上只改变了构建的dll中的函数名称。 试着在没有改变的情况下构建它,编译器对函数名称中的@发誓。 产生的cpp文件

#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]}}

生成的def文件的片断

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

我知道_TRANS2QUIK_CONNECT@16 _wrapper是代理dll中可见的函数名称 所以我把它削减为CONNECT。dll已经建立,但终端显示TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND我想这不适合我的大脑。我将不得不手动检查交易系统,并在那里下单dll。

 
f1nik:

@Maxim Kuznetsov 我在WinHex和Dependency Walker中打开了dll,它生成了Ordinal、Hint、Function、Entry Point,它生成了像(_TRANS2QUIK_CONNECT@16 这样的函数名称,有了它们,老的编译器就能工作,并返回dll结果。你是指这些象征性的名字吗?

@Alexey Viktorov 我自己也不是编程专家,但我不多的知识足以处理我的想法。Shielding\ does not work.

在python中发现自动代理dll生成器 https://github.com/mavenlin/Dll_Wrapper_Gen 。我想,如果只改变组装好的dll中的函数名称,基本上就可以了。它为visual studio建立了一个项目。试图在不做修改的情况下构建它 编译器对函数名中的@发誓。生成的cpp文件

生成的def文件的一部分。

我知道_TRANS2QUIK_CONNECT@16 _wrapper是代理dll中可见的函数名称 所以我把它削减为CONNECT。dll已经建立,但终端显示TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND我想这不适合我的大脑。我将不得不手动检查交易系统,并在那里下单dll。

你对终端和DLL的比特深度只字未提。而这是很重要的。

 

@Koldun Zloy 试过Trans2QuikAPI_1.2,它在mt4和quik7下是32位的,还有Trans2QuikAPI_1.3_x64在mt5和quik8下也是64位的。我已经在quik本身启用了外部交易。我以为我导入了错误的功能。我自己写的。

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

种等价的数据类型。如果它不对,我想它在旧的编译器中就不会工作。

 
总之,可以连接dll。如果你先调用一个解码函数(_TRANS2QUIK_CONNECT@16),那么至少有两个非解码函数可以工作。感谢每个人的回应。
 
如何用程序控制mt5的测试速度?手册中没有明确写明Sleep() 不能在测试器中使用,但它似乎不起作用......。
你需要在某一时刻降低测试的速度。手动操作很难抓住所有这样的时刻......
 
你好!我在MQL5中创建了一个 由背景和按钮组成的面板。拖动面板时,只有背景会移动,而按钮会留在原地,只有在下一次打勾时,按钮才会在背景后面移动到所需的位置。请告知如何使按钮和背景同时移动。提前感谢!
 
Mikhail:
你好!我在MQL5中创建了一个由背景和按钮组成的面板。当我拖动面板时,只有背景移动,而按钮留在原地,只有在下一次打勾时,它们才会在背景后面移动到所需的位置。请告知如何使按钮和背景同时移动。提前感谢!

我们是在谈论测试器还是在线?

如果在线--看一下代码,某处的移动事件没有正常路由。顺便说一下,网站上的面板只有五个不同的库,你是什么意思?

而在测试器中--似乎没有办法,也不知道为什么。