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(), data, strlen(data)); // last parameter is length, ie 5
// network.sendreply(content);

От клиента C ++, обменивающегося данными с сервером C ++, я получаю эти данные на сервере ...

0x0035fdf6 "Hello" (or in Bytes... 72, 101, 108, 108, 111)

Итак, после этого эссе, я думаю, что код сервера C ++ правильный, потому что я могу правильно общаться, если я пишу клиента на C ++ ... Но замена клиента C ++ клиентом, написанным на Delphi, не работает. Я заменил memcpy на CopyMemory, который, как мне казалось, делал то же самое, но почему-то мой массив байтов отличается к тому времени, когда он достигает сервера 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 кажется правильным, но данные, полученные на сервере, неверны ... Каким-то образом "Hello" ('72 101 108 108 111 ') становится

0x003efd96 "h,H" (or in Bytes 104, 19, 44, 2, 72)

Я подозреваю, что я делаю что-то не так с CopyMemory ...? Или у меня неправильное распределение памяти между exe и dll? Как узнать, какую модель памяти использует сетевая библиотека C ++? Или я только что неправильно скопировал этот массив байтов? Любая помощь очень ценится ...

8
задан 0909EM 29 December 2011 в 18:22
поделиться