請教有關DLL的使用問題 |
尚未結案
|
way888
初階會員 發表:32 回覆:76 積分:36 註冊:2005-05-31 發送簡訊給我 |
以下是DLL的文件說明:(好像是給VB使用的)
READ_RECORD_CMD
STDAPI read_next_record(int id,char *buffer) Read back current access record
If success, it will return
1. ID TIME as UPLOAD_CMD but only one record
2. no current record ,return -5
請問read_next_record(int id,char *buffer)
要如何轉成Delphi型別?
我用如下的宣告不能正常使用,是什麼原因?(其他沒有這"*"指標的就能正常)
function read_next_record(id :integer; buffer :PChar):string;external'JD.DLL';
第一次嘗試使用DLL,請多指教.....感激不盡
|
wyndog
資深會員 發表:7 回覆:362 積分:348 註冊:2004-10-12 發送簡訊給我 |
function read_next_record(id :integer; buffer :PChar):string;external'JD.DLL'; string?我從說明來判斷,應該是不需要傳回值吧?
所以,宣告成這樣即可
procedure read_next_record(id: integer; buffer: PChar); external 'JD.DLL'; 再來,就是你傳進去的那個 buffer 要記得配置空間啊
不然,硬生生的直接將一個 PChar 塞進去,這樣一定掛
|
way888
初階會員 發表:32 回覆:76 積分:36 註冊:2005-05-31 發送簡訊給我 |
|
roger128
初階會員 發表:27 回覆:45 積分:25 註冊:2002-08-29 發送簡訊給我 |
Var
AStr:String ;
APChar:PChar; String ->PChar
APChar := PChar(AStr);
PChar -> String
AStr := StrPas(APChar);
1. 在參考 reptile 大大 宣告
procedure read_next_record(id: integer; buffer: PChar);
external 'JD.DLL';
2. 試試PChar <---> String; 發表人 - roger128 於 2005/06/17 16:55:15
|
wyndog
資深會員 發表:7 回覆:362 積分:348 註冊:2004-10-12 發送簡訊給我 |
引言: read_next_record(id :integer;buffer:string);external'JDtr3.DLL'; var s :^string; getmem(s,50); read_next_record(5,s^); freemem(s); 請問這樣的程式碼可行嗎? var s: PChar; begin GetMem(s, 50); read_next_record(5, s); FreeMem(s);不過,這要確定 s 沒有要用了,才可以 Free 哦 其實我自己不習慣用 PChar,我都是用這個方法的 XD var s: string; begin SetLength(s, 100); // 幫 s 配空間 read_next_record(5, PChar(s)); end; // 或者是 var s: array [0..255] of char; begin read_next_record(5, s); end;在 Delphi 裡面,array [0..xx] of char 是可以當成 PChar 來用的 不過,在一些地方會不大一樣,要自行留意 |
way888
初階會員 發表:32 回覆:76 積分:36 註冊:2005-05-31 發送簡訊給我 |
這次真的踢到鐵板了
不知是用法錯誤或是此DLL無法給DELPHI用(有STDAPI說明應該是可用才對)
最後嘗試一些在此處前輩的文章,用POINTOR好像有點可行,但是不知要如何讀出POINTOR內的值,請問這樣的程式碼對嗎?要如何正確讀出P值?
function read_next_record(id :integer;var Buf:Pointer):longint;stdcall;external'JD.Dll';
.
.
Var
p:pointer;
.
.
read_next_record(5,P);
|
roger128
初階會員 發表:27 回覆:45 積分:25 註冊:2002-08-29 發送簡訊給我 |
1. 會不會廠商提供ㄉdll 傳回ㄉ的字串有編碼過 導致妳讀ㄉ結果有錯誤
2. 試試看
type TMyFun = function(iInt:Integer;iStr:PChar):Integer; var HInst:THandle; FPointer:TFarProc; MyFun :TMyFun; APCHAR:PChar; i:Integer; AStr:String; begin i :=5; Hinst := LoadLibrary('JD.DLL'); if HInst > 0 then begin FPointer :=GetProcAddress(Hinst,PChar('read_next_record')); @MyFun :=makeprocinstance(FPointer, Hinst); if FPointer <> nil then begin if MyFun(i,APCHAR) <> -5 then begin AStr := StrPas(APCHAR); ShowMessage(AStr); end; end else ShowMessage('Error'); end; MyFun := nil; FPointer :=nil; if not FreeLibrary(Hinst) then begin end; end;發表人 - roger128 於 2005/06/22 00:39:25 發表人 - roger128 於 2005/06/22 00:48:04 發表人 - roger128 於 2005/06/22 00:50:19 |
way888
初階會員 發表:32 回覆:76 積分:36 註冊:2005-05-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |