線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1447
推到 Plurk!
推到 Facebook!

請教有關DLL的使用問題

尚未結案
way888
初階會員


發表:32
回覆:76
積分:36
註冊:2005-05-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-17 01:12:50 IP:220.136.xxx.xxx 未訂閱
以下是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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-17 09:11:23 IP:60.248.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-17 16:21:09 IP:220.136.xxx.xxx 未訂閱
謝謝reptile指教 不過還是不行,我對指標的用法很菜,請多指教... procedure read_next_record(id :integer;buffer:string);external'JDtr3.DLL'; . var s :^string; . getmem(s,50); read_next_record(5,s^); freemem(s); 請問這樣的程式碼可行嗎?
roger128
初階會員


發表:27
回覆:45
積分:25
註冊:2002-08-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-17 16:52:45 IP:203.73.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-18 10:04:30 IP:60.248.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-19 17:37:48 IP:220.136.xxx.xxx 未訂閱
這次真的踢到鐵板了 不知是用法錯誤或是此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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-21 23:54:50 IP:61.64.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-22 23:53:18 IP:220.137.xxx.xxx 未訂閱
謝謝各位熱心幫助 可惜我的功力還不夠 對於這個DLL還是無法駕馭(可能有一些別的設定沒用好) 用了roger128大大的程式碼 回應'emH'而不是'Error',表示程式碼沒問題才對,只是我用的方法時機有問題 被這個DLL難倒了,就此放棄(這是刷卡鐘的DLL,販賣商的技術人員也說沒試過DELPHI的用法) 在此謝謝各位高手鼎力相助.....
系統時間:2024-05-19 19:47:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!