Delphi6で外部C++DLLのエンコーディング関数を使用する必要があります。提供される宣言は次のとおりです。
long <Function Name> (char *Data, long &Apply, char *ReturnVal, long &Size)
Dataは入力値、Applyはブール値(デフォルト:FALSE)、ReturnValはDLLからの戻り値、SizeはReturnValの長さです。
これをDelphi6で使用するために、次のコードを記述しました。
implementation
const
EncoderDLL = '<DLL NAME>';
FunctionName = 'FUNCTION NAME';
var
_TEST : function(const Data : PChar; Apply : PInteger;stOutput : Pchar;
iSize : PInteger) : integer; stdcall;
.....
.....
var
stInput,stOutput : string;
iLength,i1,iResult : integer;
hnd : THandle;
begin
iLength := 0;
i1 := 0;
stInput := Trim(edtInput.Text);
hnd := SafeLoadLibrary(EncoderDLL);
if hnd > 0 then
begin
@_TEST := GetProcAddress(hnd,FunctionName);
if @_TEST <> nil then
begin
iResult := _TEST(PChar(stInput),@i1,PChar(StOutput),@iLength); // ERROR
end;
end;
FreeLibrary(hnd);
end;
コメントとして「ERROR」が含まれている行にアクセス違反が発生しています。
関数宣言のPCharを文字列に置き換えると、アクセス違反は同じ行に発生しません。それはライブラリを解放している間に来ます。また、iLengthパラメーターの値が正しく入力されます。
誰かがこの問題を解決するためのポインタを提供できますか?