首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi与C++ CopyMemory

Delphi与C++ CopyMemory
EN

Stack Overflow用户
提问于 2011-12-30 02:22:59
回答 1查看 7.9K关注 0票数 8

好的--所以我似乎从来没有一个简单的问题。

我有一个用C++编写的定制库(不是我写的)。这个库做了一些网络通信,我只是将一些数据作为字节数组传递给它,并在另一端从它检索字节数组。这个库为我处理所有的网络事务,包括向/从客户机/服务器发送/接收数据。

例如,我可以编写一个客户端和一个服务器。在客户端,我生成一个字节数组,库获取该字节数组并将其发送到服务器。我写的服务器使用相同的库来做相反的事情,即处理所有流量的接收,并最终传回一个字节数组。

该库将字节数组定义为结构的一部分,如下所示...(我在Delphi中静态地加载这个库,我不认为这会有什么不同,但我使用的是FastMM4 -这会影响应用程序和动态链接库之间的内存共享模型吗?据我所知,使用FastMM应该是可以的,我也尝试了ShareMem,但没有效果)

代码语言:javascript
复制
struct content {
  void *data;
  int size;
}

无论如何,从我的客户我尝试发送“你好”...公认的智慧是使用memcpy将字节数组数据复制到此结构中,如下所示……

代码语言:javascript
复制
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

在我的服务器上,我回复"World“。所以服务器回复如下...

代码语言:javascript
复制
char *data = "World";
memcpy((void *)content.data(), data, strlen(data)); // last parameter is length, ie 5
// network.sendreply(content);

从与C++服务器通信的C++客户端,我在服务器上接收此数据...

代码语言:javascript
复制
0x0035fdf6 "Hello" (or in Bytes... 72, 101, 108, 108, 111)

因此,在这篇文章之后,我认为C++服务器代码是正确的,因为如果我用C++编写客户端,我就可以正确地通信……但是用Delphi语言编写的客户端替换C++客户端是行不通的。我用CopyMemory替换了memcpy,我认为它做了同样的事情,但不知何故,当它到达C++服务器时,我的字节数组就不同了……我的Delphi客户端执行以下操作...

代码语言:javascript
复制
// 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客户端的数据看起来是正确的,但在服务器上收到的数据是不正确的……不知何故"Hello“('72 101 108 108 111')变成了

代码语言:javascript
复制
0x003efd96 "h,H" (or in Bytes 104, 19, 44, 2, 72)

我怀疑我对CopyMemory做错了什么…?或者我把exe和dll之间的内存共享弄错了?如何知道C++ networking库使用哪种内存模型?或者我只是错误地复制了那个字节数组?任何帮助都非常感谢...

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-30 02:52:17

代码语言:javascript
复制
CopyMemory(lContentPointer, @ByteArray, 5);

错误在于,ByteArray实际上是指向数组第一个元素的指针。因此,您将指针的地址传递给数组的第一个元素。换句话说,你有一个额外的,虚假的,间接的层次。你需要

代码语言:javascript
复制
CopyMemory(lContentPointer, @ByteArray[0], 5);

代码语言:javascript
复制
CopyMemory(lContentPointer, Pointer(ByteArray), 5);

对于CopyMemorymemcpy,前者是Win32应用编程接口函数,后者是C标准库函数。这两个功能执行相同的任务,并且可以互换。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8671728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档