2016-09-28 3 views
-3

Я познакомился с более подробными вопросами. Итак, я изменил Вопрос. Спасибо людям, которые ранее задавали вопрос об ответе.В Delphi я отправляю AnsiString Data в C++ DLL Function, но входное значение было потеряно. Почему это случилось?

Теперь, это подробный вопрос. В Дельфах, я отправляю данные типа AnsiString в C++ функции в DLL

В Delphi07

TFunctionA = function (aHandle: FunctionAHANDLE ; input: AnsiString): AnsiString; cdecl; 
.... 
FunctionA('Test string value'); 

В C++ DLL

char * FunctionA(char *input){ 
     .... 
    return pReturn; 
    }; 

В ситуации, я подтвердил данные (полукокс * ввод) с использованием Visual Studio 15 Debug, данные были потеряны (AnsiString)

Но в Delphi тип возвращаемого свойства TFunctionA AnsiString для AnsiChar, , а затем передаются данные (ввод char *) ("Test string value").

TFunctionA = function (aHandle: FunctionAHANDLE ; input: AnsiString): AnsiChar; cdecl; 

Я не знаю этой ситуации, потому что я никогда не работал с Delphi.

+1

В коде есть ошибка. Не особенно полезно, но лучший, кто может, возможно, сделать для вас без [mcve] или хрустального шара. – user4581301

+1

Что такое 'CString'? Класс C++, содержащий строку? Если это так, Delphi не сможет его использовать. Что это за «другая функция» и что она делает? Как @ user4581301 говорит, покажите [mcve]. Неясно, что происходит из вашего довольно смутного описания. –

+1

Дефект в вашем коде. Либо отлаживайте его самостоятельно, либо покажите MCVE. –

ответ

1

Delphi's AnsiString похоже, но определенно не то же самое, что и C's char *. Если предположить, что функция С:

char * FunctionA(char *input){ 
    .... 
return pReturn; 
}; 

Тогда ваша декларация Delphi должна выглядеть следующим образом:

function FunctionA(Input: PAnsiString): PAnsiString; cdecl; 

И вы бы использовать его таким образом:

var 
    SomeInput, SomeOutput: AnsiString; 
begin 
    SomeInput := 'foobar'; 
    SomeOutput := AnsiString(FunctionA(PAnsiChar(SomeInput))); 
    Writeln(SomeOutput); 
end; 

Здесь вы первый «преобразовать "(не совсем, но достаточно близко) AnsiString SomeInput to PAnsiChar, который представляет собой строку с нулевым завершением, точно равную C char *. Вы передаете это функции C, а затем преобразуете (действительно) результат char * (то же самое, что и Delphi PAnsiChar) в Delphi's AnsiString.

Или, если вы хотите, чтобы объяснить это в C/C++ терминов, то есть C++ string а, вы можете «конвертировать» в char * с помощью string::c_str(), а затем создать новый string основан на char * благодаря string(char *) конструктора ,

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

  • Нет связанных вопросов^_^