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

求救~ 如何用DELPHI 宣告呼叫C寫的DLL~~

尚未結案
brianwung
一般會員


發表:18
回覆:22
積分:8
註冊:2002-06-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-12 09:05:52 IP:220.228.xxx.xxx 未訂閱
如何用DELPHI 宣告呼叫C寫的DLL,請各位大大幫忙,謝謝 Function Define : int DLL_IMPORT_EXPORT CR_ParseP12File( char *pin, /* IN unsigned char *p12, /* IN(bincode) int len12, /* IN unsigned char **cert, /* R int *lenCert /* R ); IN 表示傳入參數, R 表是傳出參數
wyndog
資深會員


發表:7
回覆:362
積分:348
註冊:2004-10-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-12 09:18:37 IP:60.248.xxx.xxx 未訂閱
這樣寫就行了 function CR_ParseP12File(pin, p12: PChar; len12: integer; var cert: PChar; var lenCert: integer): integer; external 'DLLNAME'; 試試看吧
brianwung
一般會員


發表:18
回覆:22
積分:8
註冊:2002-06-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-12 16:12:30 IP:220.228.xxx.xxx 未訂閱
其中 unsigned char *p12, 是要帶入檔案內容(bincode) 但如果是用pchar如何帶進去? 用pointer嗎?
wyndog
資深會員


發表:7
回覆:362
積分:348
註冊:2004-10-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-13 01:32:30 IP:61.62.xxx.xxx 未訂閱
嗯,用 Pointer 當然也是可以
brianwung
一般會員


發表:18
回覆:22
積分:8
註冊:2002-06-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-13 10:44:20 IP:61.67.xxx.xxx 未訂閱
出現Access violation ... 真是傷腦筋丫 有那要注意的嗎?
wyndog
資深會員


發表:7
回覆:362
積分:348
註冊:2004-10-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-04-13 12:16:44 IP:60.248.xxx.xxx 未訂閱
引言: 出現Access violation ... 真是傷腦筋丫 有那要注意的嗎? < face="Verdana, Arial, Helvetica"> 顯然是指標指錯了吧
brianwung
一般會員


發表:18
回覆:22
積分:8
註冊:2002-06-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-04-13 13:46:58 IP:61.67.xxx.xxx 未訂閱
實在是試不出來,將原文貼出來請幫忙寫成delphi,感激不盡丫。 1. 開啟 XXXXX 檔案 2. 將檔案內的資料讀進並存放在一個字串陣列內 3. 呼叫 CR_ChangeUserIdPin(), 前四個參數為傳入(in),分別是原註冊資料,原註冊資料長度,舊密碼,新密碼; 後兩個參數為傳出(out),分別是新註冊資料,新註冊資料長度 4. 將新註冊資料寫入XXXXX 檔 Function Name : CR_ChangeUserIdPin Function Define : int DLL_IMPORT_EXPORT CR_ChangeUserIdPin( unsigned char *oldFile, /* IN –原註冊資料*/ int lenOldFile, /* IN –原註冊資料長度*/ char *oldPin, /* IN –舊密碼*/ char *newPin, /* IN –新密碼*/ unsigned char **newFile, /* R dynamic –新註冊資料*/ int *lenNewFile, /* R –新註冊資料長度*/ ); IN 表示傳入參數, R 表是傳出參數
wyndog
資深會員


發表:7
回覆:362
積分:348
註冊:2004-10-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-04-13 20:17:00 IP:61.62.xxx.xxx 未訂閱
// 宣告
function CR_ChangeUserIdPin(
  oldFile: Pointer;
  lenOldFile: integer;
  oldPin: PChar;
  newPin: PChar;
  var newFile: Pointer;
  var lenNewFile: integer): integer; stdcall; external 'DLLNAME';    // 範例
var
  oldPin, newPin: string;
  lenOldFile, lenNewFile: integer;
  oldFile: array [0..XXX] of char;
  newFile: Pointer;
begin
  ...
  oldPin := 'OLD Pass';
  newPin := 'NEW Pass';
  ...
// 因為沒有這個 function 的詳細定義
// 我只能推斷說,newFile 是由 DLL 負責配置記憶體的,所以才傳 ** 過去
// 所以,我就在 Delphi 中改成 var XX: Pointer
  CR_ChangeUserIdPin(
    @ oldFile,
    lenOldFile,
    PChar(oldPin),
    PChar(newPin),
    newFile,
    lenNewFile);
end;
我只能猜大概是這樣用 Access violation 大柢是指標出了問題 這個部份多留意就行了
brianwung
一般會員


發表:18
回覆:22
積分:8
註冊:2002-06-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-04-14 10:00:48 IP:211.76.xxx.xxx 未訂閱
不會出現Access violation 接下來我就先自已試試了, 真是非常感謝
系統時間:2024-05-17 14:35:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!