Delphi CopyMemory vs C memcpy
好的 – 所以我似乎从来没有一个简单的问题.
我有一个用C编写的自定义库(不是我写的).这个库做了一些网络通信,我只是将一些数据作为字节数组传递给它,并从另一侧检索一个字节数组.该库为我处理所有网络内容,即向/从客户端/服务器发送/接收数据. 例如,我可以编写客户端和服务器.从客户端我生成一个字节数组,该库获取字节数组并将其发送到服务器.我编写的服务器使用相同的库来执行相反的操作,即处理所有流量接收并最终传回一个字节数组. 该库将字节数组定义为结构的一部分,如下所示…(我在Delphi中静态加载库,不要认为这会有所作为,但我使用的是FastMM4 – 这会影响到应用程序和DLL之间的内存共享模型?我知道使用FastMM应该没关系,也试过ShareMem无济于事) struct content { void *data; int size; } 无论如何,从我的客户端我试图发送“你好”…接受的智慧是字节数组数据通过使用memcpy复制到这个结构中,如此… char *data = "Hello"; memcpy((void *)content.data(),data,strlen(data)); // last parameter is length,ie 5 // network.sendrequest(content); // where content.data() returns the aforementioned pointer 在我的服务器上,我回复“世界”.所以服务器回复如下…… char *data = "World"; memcpy((void *)content.data(),ie 5 // network.sendreply(content); 从与C服务器通信的C客户端,我在服务器上收到这些数据…… 0x0035fdf6 "Hello" (or in Bytes... 72,101,108,111) 所以在那篇文章之后,我认为C服务器代码是正确的,因为如果我用C编写客户端我可以正确地进行通信……但用Delphi编写的客户端替换C客户端是行不通的.我已经用CopyMemory替换了memcpy,我认为它做了同样的事情但不知何故我的字节数组在到达C服务器时有所不同…我的Delphi客户端执行以下操作… // lDataPointer is a retrieved reference to the // pointer (void *data; see above) defined in the // C++ library. It appears to be a valid pointer at runtime... lContentPointer := content.data(); // from DLL // Where ByteArray is populated with byte data of "Hello" CopyMemory(lContentPointer,@ByteArray,5); // Copy from Exe to DLL // network.sendrequest(lContentPointer); // I have printed the byte array before the CopyMemory to check // its contents before sending,which is '72 101 108 108 111' 所以来自Delphi客户端的数据看起来是正确的,但服务器上收到的数据是不正确的…不知怎的“你好”(’72 101 108 108 111′)变成了 0x003efd96 "h,H" (or in Bytes 104,19,44,2,72) 我怀疑我在使用CopyMemory做错了什么……?或者我有exe和DLL之间的内存共享错误?我如何知道C网络库使用哪种内存模型?或者我刚刚错误地复制了该字节数组?任何帮助非常感谢… 解决方法CopyMemory(lContentPointer,5); 错误是ByteArray实际上是指向数组第一个元素的指针.因此,您将指针的地址传递给数组的第一个元素.换句话说,你有一个额外的,虚假的间接水平.你需要 CopyMemory(lContentPointer,@ByteArray[0],5); 要么 CopyMemory(lContentPointer,Pointer(ByteArray),5); 至于CopyMemory vs memcpy,前者是Win32 API函数,后者是C标准库函数.这两个功能执行相同的任务并且可以互换. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |