2010-10-16 3 views
1

У меня есть программа на C++, которая вызывает Delphi DLL для инициализации буфера, содержащего символы.Передача PChar/* char между 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++, Показывает m e "123", за которым следуют некоторые символы мусора.

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

ответ

4

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

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

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

+0

Спасибо. Я сделал это, и он распечатывается правильно: pHardcodedMsg: = '123' # 0; CopyMemory (pMsg, pHardcodedMsg, Length (pHardcodedMsg) +1); – seveleven

+4

-1 для «Delphi не использует строки с завершающим NULL». Строки Delphi имеют NULL-конец и нет необходимости добавлять завершение 0 - оно уже существует. Все, что вам нужно, - это использовать 4 символа вместо 3. – kludg

+2

. Строки Delphi не имеют нулевого конца (нуль не завершает строку). Но вы правы в том смысле, что строки и литералы имеют нулевое значение после содержимого строки. Возможно, это не первый. –

1

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

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

2) CopyMemory не добавляет 0 до конца ГСОК

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

При использовании версии Юникода Delphi вы также должны учитывать длину строки и преобразование набора символов

+0

1) когда установлено значение: = '123', это уже выделенная память. – seveleven

Смежные вопросы