2015-03-27 1 views
1

У меня есть DLL-, который имеет функциюэкспорта DLL проблемы с PAnsiChar в Delphi XE7 с использованием STDCALL конвенции

Decrypt(aText, aKey: PAnsiChar): PAnsiChar; stdcall 

и эта функция была экспортирована. в

exports 
    Decrypt; 

И если я вызываю от клиента ниже в пути:

lH := LoadLibrary('EncDec.dll'); 
FEncDyc := GetProcAddress(lH , PChar('Decrypt')); 

lResult := FEncDyc(PAnsiChar(AnsiString(EditPwd.Text)), 
    PAnsiChar(AnsiString(EditKey.Text))); 

где FEncDyc является указателем на FUNC типа

TDecrypt = function (aText: PAnsiChar; aKey: PAnsiChar): PAnsiChar; 

Я всегда получаю значение нежелательного для параметров aText и aKey; где я иду не так? если изменить определение DLL для

Decrypt(aText, aKey: PAnsiChar): PAnsiChar; export; 

Я получаю значение в DLL, без нежелательной characters- работает отлично!

Что не так в коде для stdcall и чем оно отличается, если вместо этого я использую ключ экспорта.

Также, пожалуйста, предложите: Каков правильный путь прохождения PAnsiChar и как его следует преобразовать в AnsiString в моей dll.

ответ

1

При импорте вы не указали соглашение о вызове. Вместо

TDecrypt = function(aText: PAnsiChar; aKey: PAnsiChar): PAnsiChar; 

вам нужно

TDecrypt = function(aText: PAnsiChar; aKey: PAnsiChar): PAnsiChar; stdcall; 

Будьте осторожны с возвращаемым значением. Вы должны убедиться, что возвращаемое вами значение распределяется динамически с использованием GetMem или его эквивалента. И вам также нужно экспортировать deallocator из DLL.

+0

Если мне нужно передать значение типа PansiChar - это правильный путь? –

+0

Ваша встреча в порядке. Преобразование в AnsiString, а затем отбрасывание в PAnsiChar, все в порядке. –

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