文章 "摆脱自制的 DLL" - 页 4

 
Maxim Kuznetsov #:

最后一个参数(即 cnt)也是 64 位。它是 size_t

https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/memcpy-wmemcpy

谢谢。

 
Maxim Kuznetsov #:

当然有......原型是 4 位的(32 位地址,类似无符号 int),而编译/运行是 5 位的(64 位)。

弱智,我之前就是 通过 longs 的。

#define  MEMCPY_MACROS(A)                                                     \
long memcpy( const long Destination, const A &Source[], const uint Length ); \
long memcpy( A &Destination[], const long Source, const uint Length );
 
Edgar Akhmadeev #:

我忽略了 64 位地址的问题。但使用更正后的地址时,我还是会崩溃。它真的能工作吗?我能看看修正后的 fxsaber 代码的完整示例吗?

到目前为止,我仍然认为 WinAPI 的地址与 MQL 不兼容。

我发现了一个错误,这就是为什么更正后的版本对我不起作用。我打错了一个字,漏了一个地方。

我的观点改变了,谢谢大家。

 

顺便说一句,MS 认为memcpy 函数不安全且已过时,建议用 memcpy_s 代替。此外,第一个参数不是常量。所以结果是

#define  DEF_MEMCPY_S(T)                                                   \
        ulong memcpy_s(T &dst,   ulong size, const ulong src, ulong cnt); \
        ulong memcpy_s(T &dst[], ulong size, const ulong src, ulong cnt); \
        ulong memcpy_s(T &dst,   ulong size, const T &src[],  ulong cnt); \
        ulong memcpy_s(T &dst[], ulong size, const T &src[],  ulong cnt);
        
#import "msvcrt.dll"
        DEF_MEMCPY_S(char)
        DEF_MEMCPY_S(uchar)
        DEF_MEMCPY_S(int)
        DEF_MEMCPY_S(uint)
        DEF_MEMCPY_S(long)
        DEF_MEMCPY_S(ulong)
#import



void OnStart() {
        int Array[];
        ArrayResize(Array, 1);
        Array[0] = 123;
        int Value1 = 0;
        int Value2 = 0;
        
        ulong Address = memcpy(Array, 0, 0);
        memcpy_s(Value1, sizeof(int), Address, sizeof(int));
        
        memcpy_s(Value2, sizeof(int), Array,   sizeof(int));
        
        Print(Value1, " ", Value2);
}
 

有趣的例子。请教行家一个问题。有可能获取任何类的向量、矩阵或对象的地址吗?

 
Denis Kirichenko #:

有趣的例子。请教行家一个问题。有可能获取任何类的向量、矩阵或对象的地址吗?

没有