DLL 原型:
Void OperateDisk (LPSTR strInputInfo, LPSTR* strOutputInfo)
我自己生成delphi 介面
procedure OpenXX(strInputInfo: pchar; var strOutputInfo: pPAnsiChar); cdecl; external 'OPEN_DLL.DLL' ;
呼叫測驗代碼:
var
s1: pchar;
s2: pPAnsiChar;
begin
s1:='12345678';
OpenXX(s1, s2);
StrValue := strpas(@s2);
ShowMessage('長度:' + IntToStr(StrLen(@s2)));
showmessage(StrValue);
end;
編譯正常,但呼叫執行完后就地址錯誤,
請高手指點,謝謝!
uj5u.com熱心網友回復:
LPSTR*對應PPAnsiChar是對的,也可以是PLPSTR,Windows單元有宣告的.Void OperateDisk (LPSTR strInputInfo, LPSTR* strOutputInfo);應該翻譯成
下面兩種任意一種都可以.
procedure OperateDisk(strInputInfo : LPSTR; var strOutputInfo : LPSTR); cdecl; external 'OPEN_DLL.DLL' ;
procedure OperateDisk(strInputInfo : LPSTR; strOutputInfo : PLPSTR); cdecl; external 'OPEN_DLL.DLL' ;
另外到底是cdecl還是stdcall約定樓主再確認一下
兩種宣告方式呼叫方式的區別就是:
procedure OperateDisk(strInputInfo : LPSTR; var strOutputInfo : LPSTR); cdecl; external 'OPEN_DLL.DLL' ;
.....
var
s1: LPSTR;
s2: LPSTR;
begin
s1 :='12345678';
OperateDisk(s1, s2);
showmessage(StrPas(s2));
end;
procedure OperateDisk(strInputInfo : LPSTR; strOutputInfo : PLPSTR); cdecl; external 'OPEN_DLL.DLL' ;
......
var
s1: LPSTR;
s2: LPSTR;
begin
s1 :='12345678';
OperateDisk(s1, @s2);
showmessage(StrPas(s2));
end;
或者加個overload
procedure OperateDisk(strInputInfo : LPSTR; var strOutputInfo : LPSTR); cdecl; overload; external 'OPEN_DLL.DLL' ;
procedure OperateDisk(strInputInfo : LPSTR; strOutputInfo : PLPSTR); cdecl; overload; external 'OPEN_DLL.DLL' ;
這樣兩種方式都能用,呼叫的都是同一個函式
uj5u.com熱心網友回復:
@wr960204謝謝您的指教,但是按您的方法,執行完后,有回傳值,但是所有代碼執行完后也報地址例外錯誤!
還有什么其他原因嗎?是不是指標沒申明長度或銷毀造成的
能加一下我QQ:46513544,幫忙一下!謝謝!
按這個
stdcall 好像也不行啊!
uj5u.com熱心網友回復:
用PChar看看uj5u.com熱心網友回復:
也不行,執行完后也是地址錯誤!
uj5u.com熱心網友回復:
vars1: LPSTR;
s2: array[0..99] of Char;
這樣試試
uj5u.com熱心網友回復:
vars1: pchar;
s2: pPAnsiChar;
begin
s1:='12345678';
OpenXX(s1,s2);
StrValue := strpas(s2^);
uj5u.com熱心網友回復:
StrValue := strpas(s2^);這句就直接地址例外了
uj5u.com熱心網友回復:
s2是ppansichar,那s2^就是pansichar
uj5u.com熱心網友回復:
試試 procedure OpenXX(strInputInfo: pchar; var strOutputInfo: PAnsiChar); cdecl; external 'OPEN_DLL.DLL' ;是cdecl還是stdcall你自己調
uj5u.com熱心網友回復:
procedure OpenXX(strInputInfo: pchar; var strOutputInfo: pchar); cdecl; external 'OPEN_DLL.DLL' ;strInputInfo 、strOutputInfo都使用GETMEM分配一定的記憶體比如1024、2048
然后使用StrPCopy(),StrPas之流
最后 FreeMem
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/87394.html
標籤:VCL組件開發及應用
