全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1503
推到 Plurk!
推到 Facebook!

請問如何呼叫DLL之函數

尚未結案
shing.net
中階會員


發表:207
回覆:124
積分:66
註冊:2002-03-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-25 14:04:14 IP:61.218.xxx.xxx 未訂閱
有一DLL中之函數為 DWORD Awe(DWORD dwBk, LPBYTE pbBuff, DWORD &dwLg); 我宣告如下 function Awe(dwBk:integer;var pbBuff:Pchar;dwLg:integer):integer;stdcall;external DLL name 'Awe'; 執行時會出現錯誤 請問在delphi如何宣告? 謝謝
Skyer
高階會員


發表:43
回覆:111
積分:120
註冊:2002-04-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-25 15:15:19 IP:61.219.xxx.xxx 未訂閱
uses
  windows;    function Awe(dwBk: DWORD; pbBuff: Pointer; var dwLg: DWORD): DWORD; stdcall; external DLL name 'Awe';
第三個參數宣告成 var, 表示 call by reference.. 如果第三個參數可有可無 (通常會寫,可傳 0 or NULL) 則可改成 在 Delphi, 就放 0 or nil
function Awe(dwBk: DWORD; pbBuff: Pointer; dwLg: Pointer): DWORD; stdcall; external DLL name 'Awe';
使用方式
var
  buffer: array[0..255] of Byte;
  out: DWORD;
begin
  Awe(123, @buffer[0], out);
end;
-- Regards, Skyer
------
--
Regards,
Skyer
shing.net
中階會員


發表:207
回覆:124
積分:66
註冊:2002-03-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-25 16:58:28 IP:61.218.xxx.xxx 未訂閱
謝謝,我試沒有錯誤但是為何讀出的buffer是空的 而在BCB中讀出卻是有值 謝謝
引言:
uses
  windows;    function Awe(dwBk: DWORD; pbBuff: Pointer; var dwLg: DWORD): DWORD; stdcall; external DLL name 'Awe';
第三個參數宣告成 var, 表示 call by reference.. 如果第三個參數可有可無 (通常會寫,可傳 0 or NULL) 則可改成 在 Delphi, 就放 0 or nil
function Awe(dwBk: DWORD; pbBuff: Pointer; dwLg: Pointer): DWORD; stdcall; external DLL name 'Awe';
使用方式
var
  buffer: array[0..255] of Byte;
  out: DWORD;
begin
  Awe(123, @buffer[0], out);
end;
-- Regards, Skyer
Skyer
高階會員


發表:43
回覆:111
積分:120
註冊:2002-04-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-26 21:11:52 IP:220.139.xxx.xxx 未訂閱
不太清楚 可以把您 bcb 使用 Awe 這函數的那段程式碼發表上來嗎? 這樣我比較能為您翻譯.. 因為翻譯上有很多種選擇, 如果有 c 實際使用例子 才可以找出最好的選擇 -- Regards, Skyer
------
--
Regards,
Skyer
shing.net
中階會員


發表:207
回覆:124
積分:66
註冊:2002-03-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-01-27 11:28:43 IP:140.122.xxx.xxx 未訂閱
程式如下    var   dwBk: DWORD;   dwRBytes: DWORD;   szBuff: array[0..255] of byte;   str:string; begin     dwBk := 1;     dwRBytes := 255;     if iAwe(dwBk, @szBuff, dwRBytes) = 0 then     begin       showmessage('失敗!');     end     else     begin       str := '';       for I := 0 to high(szBuff) - 1 do       begin         str := str + char(szBuff[I]);       end;       showmessage(str);     end;    end;    
引言: 不太清楚 可以把您 bcb 使用 Awe 這函數的那段程式碼發表上來嗎? 這樣我比較能為您翻譯.. 因為翻譯上有很多種選擇, 如果有 c 實際使用例子 才可以找出最好的選擇 -- Regards, Skyer
Skyer
高階會員


發表:43
回覆:111
積分:120
註冊:2002-04-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-01-27 12:53:34 IP:220.139.xxx.xxx 未訂閱
引言: 程式如下
var
  dwBk: DWORD;
  dwRBytes: DWORD;
  szBuff: array[0..255] of byte;
  str:string;
begin
    dwBk := 1;
    dwRBytes := 255;
    if iAwe(dwBk, @szBuff[0], dwRBytes) = 0 then
    begin
      showmessage('失敗!');
    end
    else
    begin
      // 如果 szBuf 確定是個 c string (0 結尾)
      // 則可以直接 assign 給 delphi string, 不然請先在 szBuf 最後加上 0
      str := PChar(@szBuff[0]);
      showmessage(str);
    end;    end;
試試這樣作吧... @szBuf = C 的 &szBuf @szBuf[0] = C 的 &szBuf[0] 是不一樣的.. 再來 PChar 轉 String 可直接 assign -- Regards, Skyer 發表人 - Skyer 於 2005/01/27 12:58:10 發表人 - Skyer 於 2005/01/27 12:59:38
------
--
Regards,
Skyer
shing.net
中階會員


發表:207
回覆:124
積分:66
註冊:2002-03-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-01-27 15:13:50 IP:61.218.xxx.xxx 未訂閱
你好,我試了其值仍是空的,我不清楚szBuf 是否為 c string  // 如果 szBuf 確定是個 c string (0 結尾) // 則可以直接 assign 給 delphi string, 不然請先在 szBuf 最後加上 0 且如何加上0 謝謝
引言:
引言: 程式如下
var
  dwBk: DWORD;
  dwRBytes: DWORD;
  szBuff: array[0..255] of byte;
  str:string;
begin
    dwBk := 1;
    dwRBytes := 255;
    if iAwe(dwBk, @szBuff[0], dwRBytes) = 0 then
    begin
      showmessage('失敗!');
    end
    else
    begin
      // 如果 szBuf 確定是個 c string (0 結尾)
      // 則可以直接 assign 給 delphi string, 不然請先在 szBuf 最後加上 0
      str := PChar(@szBuff[0]);
      showmessage(str);
    end;    end;
試試這樣作吧... @szBuf = C 的 &szBuf @szBuf[0] = C 的 &szBuf[0] 是不一樣的.. 再來 PChar 轉 String 可直接 assign -- Regards, Skyer 發表人 - Skyer 於 2005/01/27 12:58:10 發表人 - Skyer 於 2005/01/27 12:59:38
shing.net
中階會員


發表:207
回覆:124
積分:66
註冊:2002-03-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-01-27 15:16:17 IP:61.218.xxx.xxx 未訂閱
你好,我試了其值仍是空的,我不清楚szBuf 是否為 c string  // 如果 szBuf 確定是個 c string (0 結尾) // 則可以直接 assign 給 delphi string, 不然請先在 szBuf 最後加上 0 且如何加上0 謝謝
引言:
引言: 程式如下
var
  dwBk: DWORD;
  dwRBytes: DWORD;
  szBuff: array[0..255] of byte;
  str:string;
begin
    dwBk := 1;
    dwRBytes := 255;
    if iAwe(dwBk, @szBuff[0], dwRBytes) = 0 then
    begin
      showmessage('失敗!');
    end
    else
    begin
      // 如果 szBuf 確定是個 c string (0 結尾)
      // 則可以直接 assign 給 delphi string, 不然請先在 szBuf 最後加上 0
      str := PChar(@szBuff[0]);
      showmessage(str);
    end;    end;
試試這樣作吧... @szBuf = C 的 &szBuf @szBuf[0] = C 的 &szBuf[0] 是不一樣的.. 再來 PChar 轉 String 可直接 assign -- Regards, Skyer 發表人 - Skyer 於 2005/01/27 12:58:10 發表人 - Skyer 於 2005/01/27 12:59:38
Skyer
高階會員


發表:43
回覆:111
積分:120
註冊:2002-04-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-01-27 17:36:20 IP:220.139.xxx.xxx 未訂閱
還是不行啊 那您可以把 BCB 的程式有用這這個函數發表上來嗎? 因為就使用方式上,Delphi 並沒有錯... 會不會是在調用 DLL function 時出錯了.. -- Regards, Skyer
------
--
Regards,
Skyer
shing.net
中階會員


發表:207
回覆:124
積分:66
註冊:2002-03-16

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-01-28 08:43:57 IP:61.218.xxx.xxx 未訂閱
BCB程式如下: char temp[20];   DWORD dwBck;   AnsiString sOput = "";   BYTE szBuff[256];   DWORD dwBytes = 256;   dwBk = 1;   if(Awe(dwBk, szBuff, dwBytes) == false)     ShowMessage("fail");   for(int i = 0; i < dwBytes; i++)   {     sprintf(temp, "x", szBuff[i]);     sOput = sOput + temp;   }   Edit1->Text = sOput.c_str(); 謝謝
引言: 還是不行啊 那您可以把 BCB 的程式有用這這個函數發表上來嗎? 因為就使用方式上,Delphi 並沒有錯... 會不會是在調用 DLL function 時出錯了.. -- Regards, Skyer
Skyer
高階會員


發表:43
回覆:111
積分:120
註冊:2002-04-04

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-01-28 17:59:00 IP:61.219.xxx.xxx 未訂閱
uses
  windows;    function Awe(dwBk: DWORD; pbBuff: Pointer; var dwLg: DWORD): DWORD; stdcall; external DLL name 'Awe';    var
  dwBck: DWORD;
  sOput: string;
  szBuff: array[0..255] of Byte;
  dwBytes: DWORD;
  i: Integer;
begin
  dwBck := 1;
  dwBytes := 256;
  if Awe(dwBk, @szBuff[0], dwBytes) = 0 then
    ShowMessage('Failed.')
  else begin
    for i:=0 to dwBytes-1 do begin
      sOput := sOput   Format('%.2x', [szBuff[i]]);
    end;
    Edit1.Text := sOput;
  end;
end;
-- Regards, Skyer
------
--
Regards,
Skyer
Skyer
高階會員


發表:43
回覆:111
積分:120
註冊:2002-04-04

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-01-28 18:07:13 IP:61.219.xxx.xxx 未訂閱
想到一點,確定 Awe 是採 stdcall 嗎? 標準 C/C 應該是採用 cdecl? 不過呼叫方式弄錯的話,應該會發生 runtime error 才對 :p 因為 stdcall 由 Awe 恢復 stack cdecl 由呼叫 Awe 端來恢復 stack -- Regards, Skyer
------
--
Regards,
Skyer
系統時間:2024-06-27 1:54:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!