Передача PChar / * char между C ++ и Delphi DLL - PullRequest
1 голос
/ 16 октября 2010

У меня есть программа на C ++, которая вызывает Delphi DLL для инициализации буфера, содержащего символы.

Я тестирую интерфейс, чтобы убедиться, что данные переданы правильно:

В программе на C ++:

char * pMsg = (char*)malloc(3); //allocate buffer

Init(pMsg * char); //Delphi DLL function

В Delphi DLL:

procedure Init(pMsg:PChar);
var
  pHardcodedMsg:PChar;
begin
  pHardcodedMsg:= '123';
  CopyMemory(pMsg, pHardcodedMsg, Length(pHardcodedMsg));
end;

Но, когда я пытаюсь printf( (const char*)pMsg ) в C ++, Он показывает мне «123», за которым следуют некоторые мусорные символы.

Почему это так? Как я могу успешно поместить массив char в буфер и правильно распечатать строку?

Ответы [ 2 ]

4 голосов
/ 16 октября 2010

Delphi не использует строки, оканчивающиеся на NULL, поэтому вам нужно добавить 0 в конце, поскольку C / C ++ использует это для определения места окончания данных строки (Pascal использует размер строки в начале IIRC).

Обычный символ '\ 0' - escape-значение 0.

Не забудьте вернуть 4 символа, а не 3.

1 голос
/ 17 октября 2010

Ваша функция Init не работает, потому что

1) pHardcodedMsg - указатель, для которого вы не выделяли память

2) CopyMemory не добавляет 0 в конец pMsg

3) заголовок процедуры Init пропускает точку с запятой в конце строки

Когда вы используете версию Delphi для Unicode, вам также необходимо учитывать длину строки и преобразование набора символов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...