請教一個 C 的語法轉換 |
缺席
|
adonis
高階會員 發表:140 回覆:258 積分:159 註冊:2002-04-15 發送簡訊給我 |
|
wyndog
資深會員 發表:7 回覆:362 積分:348 註冊:2004-10-12 發送簡訊給我 |
|
adonis
高階會員 發表:140 回覆:258 積分:159 註冊:2002-04-15 發送簡訊給我 |
reptile, 謝謝您的回應 可我不明白的是 (*PFNHCTNOTIFY) 其 * 不用去理會它嗎?C 的 * 不是用來表示指標的嗎? 如果說是:typedef void PFNHCTNOTIFY( UINT nNotify, DWORD dwData );
那改寫成:
type
PFNHCTNOTIFY = procedure (nNotify, dwData: Cardinal); stdcall;
是沒問題的,但是總覺得 "*" 這邊怪怪的 .. ?不需要特別的改寫什麼嗎?
------
我也在努力學習中,若有錯謬請見諒。 |
wyndog
資深會員 發表:7 回覆:362 積分:348 註冊:2004-10-12 發送簡訊給我 |
|
adonis
高階會員 發表:140 回覆:258 積分:159 註冊:2002-04-15 發送簡訊給我 |
reptile, 謝謝您的回應 ~ 再請教兩段語法的轉換 #define HCT_MAKEVERSION(Major, Minor, Build ) ﹨
MAKELONG( MAKEWORD( 0, Build ), MAKEWORD( Minor, Major )) 和
#ifdef HCT_EXPORTS #define HCTAPI __declspec(dllexport) WINAPI #else #define HCTAPI __declspec(dllimport) WINAPI #endif發表人 - adonis 於 2005/07/01 12:31:57 發表人 - adonis 於 2005/07/01 12:35:03 發表人 - adonis 於 2005/07/01 12:36:28
------
我也在努力學習中,若有錯謬請見諒。 |
wyndog
資深會員 發表:7 回覆:362 積分:348 註冊:2004-10-12 發送簡訊給我 |
引言:#define HCT_MAKEVERSION(Major, Minor, Build ) ﹨ MAKELONG( MAKEWORD( 0, Build ), MAKEWORD( Minor, Major )) function HCT_MAKEVERSION(Major, Minor, Build: integer): Cardinal; begin Result := (Major shl 24) (Minor shl 16) (Build shl 8); end; 引言:這一段就不太要理了,原則上,就是在 function 的後面加 stdcall; 就行了#ifdef HCT_EXPORTS #define HCTAPI __declspec(dllexport) WINAPI #else #define HCTAPI __declspec(dllimport) WINAPI #endif |
adonis
高階會員 發表:140 回覆:258 積分:159 註冊:2002-04-15 發送簡訊給我 |
reptile前輩, 謝謝您熱心的回應 ~ 但著實有太多不明白的地方,若這樣一一的詢問怕您會煩,所以我將其 .h 檔放置站內,如下連結:
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=74271 希望您不要介意,您熱心的回應著實讓我獲益,對仍不明白的地方,望您解惑,謝謝。
------
我也在努力學習中,若有錯謬請見諒。 |
wyndog
資深會員 發表:7 回覆:362 積分:348 註冊:2004-10-12 發送簡訊給我 |
|
wyndog
資深會員 發表:7 回覆:362 積分:348 註冊:2004-10-12 發送簡訊給我 |
1. #ifdef, #ifndef 這是 C/C++ 才要用的,Delphi 暫不用理他 2. typedef DWORD HCTERR;
這種的就是寫成 type HCTERR = DWORD; 3. #define HCTAPI __declspec(dllexport) WINAPI
這也是給 C/C++ 編譯器看的,Delphi 裡是在函數宣告的時候,在後面接 stdcall
4. IN, OUT 這是修飾詞,寫好看的,不予理會
5. 函數宣告裡面,有 * 的是傳址呼叫,可以用 var 或是傳指標進去
6. WINAPI 就是傳回 integer 的 function
綜合 3,4,5, 6 的範例如下
HCTERR HCTAPI HCTGetEvent ( IN RECEIVERID rid, OUT HCTEVENT *pEvt );
改寫成
function HCTGetEvent(rid: RECEIVERID; pEvt: PHCTEVENT): integer; stdcall;
or
function HCTGetEvent(rid: RECEIVERID; var Evt: HCTEVENT): integer; stdcall;
注意紅色字的地方不太一樣 7. 其實 HCT_VERSION 的部份,只是要設一個常數值而已
所以,不太有必要去實作 MAKEVERSION, MAKELONG, MAKEWORD
其實就是
const HCT_VERSION = $01011300; // $ Major, Minor, Build, 0 8. #define IN, #define OUT 如前言,只是裝飾字,不用翻 9. #define HCT_PORT_NONE 0x0 等等
const HCT_PORT_NONE = $0; 10.
#define HCT_ISPENEVENT(x) ((((x) >= HCT_EVT_PENEVENTS_BEGIN) && ((x) <= HCT_EVT_PENEVENTS_END)) ? TRUE : FALSE ) function HCT_ISPENEVENT(x: integer): boolean; begin if (x >= HCT_EVT_PENEVENTS_BEGIN) and (x <= HCT_EVT_PENEVENTS_END) then result := True else result := False; end;11. << 就是 SHR, >> 就是 SHL12. typedef struct { DWORD dwSize; DWORD dwFlags; DWORD Reserved1; DWORD Reserved2; PFNHCTNOTIFY pfnHCTNotify; DWORD uMessage; HWND hWnd; } HCTRECEIVER;//, *PHCTRECEIVER; type HCTRECEIVER = packed record dwSize: DWORD; dwFlags: DOWRD; .... end; PHCTRECEIVER = ^HCTRECEIVER;13. USHORT 相當於 WORD, SHORT 相當於 SmallInt |
adonis
高階會員 發表:140 回覆:258 積分:159 註冊:2002-04-15 發送簡訊給我 |
reptile, 謝謝您耐心的教導 再請教
一、
#define HCT_PORT_NONE 0x0
--> Const HCT_PORT_NONE = $0;
那 ..
#define HCT_PORT_USB ((unsigned) -1) 呢? 二、
於前述的第 10 點
在 Delphi 中,函數的宣告與實作不是要分開的嗎?所以 ..
begin
..
end;
是否應置於 implementation 之後? 謝謝。 發表人 - adonis 於 2005/07/02 16:39:56
------
我也在努力學習中,若有錯謬請見諒。 |
wyndog
資深會員 發表:7 回覆:362 積分:348 註冊:2004-10-12 發送簡訊給我 |
引言: 再請教 一、 #define HCT_PORT_NONE 0x0 --> Const HCT_PORT_NONE = $0; 那 .. #define HCT_PORT_USB ((unsigned) -1) 呢?Const HCT_PORT_USB = $FFFFFFFF; 引言: 二、 於前述的第 10 點 在 Delphi 中,函數的宣告與實作不是要分開的嗎?所以 .. begin .. end; 是否應置於 implementation 之後?在 interface 的地方,寫上 function XXXXX: boolean; 在 implementation 之後,寫上 function xXXXX: boolean; begin .. end; |
adonis
高階會員 發表:140 回覆:258 積分:159 註冊:2002-04-15 發送簡訊給我 |
reptile, 謝謝您的回應 再請教 #define HCT_ERR_SEVERITY ((ULONG) 3 << 30)
是否即為 const HCT_ERR_SEVERITY = (3 shr 30);
如是,其 ULONG 不用理會嗎?還是要依 ULONG 的格式,在其值為 3 時的二進位格式作完 shr 30 之後的值再給HCT_ERR_SEVERITY? 那 ..
typedef DWORD RECEIVERID;
#define HCT_RID_INVALID ((RECEIVERID) -1)
其結果是否亦為 Const HCT_RID_INVALID = $FFFFFFFF; ?
因其 unsigned & DWORD 是同樣大小。 謝謝。
------
我也在努力學習中,若有錯謬請見諒。 |
wyndog
資深會員 發表:7 回覆:362 積分:348 註冊:2004-10-12 發送簡訊給我 |
引言: 再請教 #define HCT_ERR_SEVERITY ((ULONG) 3 << 30) 是否即為 const HCT_ERR_SEVERITY = (3 shr 30); 如是,其 ULONG 不用理會嗎?還是要依 ULONG 的格式,在其值為 3 時的二進位格式作完 shr 30 之後的值再給HCT_ERR_SEVERITY?直接幫他算出來好了,這樣比較保險 Const HCT_ERR_SEVERITY = $C0000000; 引言: 那 .. typedef DWORD RECEIVERID; #define HCT_RID_INVALID ((RECEIVERID) -1) 其結果是否亦為 Const HCT_RID_INVALID = $FFFFFFFF; ? 因其 unsigned & DWORD 是同樣大小。Yes [/quote] |
adonis
高階會員 發表:140 回覆:258 積分:159 註冊:2002-04-15 發送簡訊給我 |
reptile, 您好 花了一些時間把遺忘已久的 "C" 再次回復記憶 ^ ^ ~ 謝謝 reptile 前輩不厭其煩的教導,讓我獲益良多。
茲將先前所放置的 .h 檔
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=74271
今已全部轉譯為 .pas 檔,如
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=74311 殊不知尚有何處是錯謬的,請您指正,謝謝。
------
我也在努力學習中,若有錯謬請見諒。 |
wyndog
資深會員 發表:7 回覆:362 積分:348 註冊:2004-10-12 發送簡訊給我 |
HCTRegisterReceiver: Function(pReceiver: RECEIVERINFO; pRID: RECEIVERID):HCTERR; Stdcall; 原始是
HCTERR HCTAPI HCTRegisterReceiver ( IN RECEIVERINFO *pReceiver, OUT RECEIVERID *pRID ); 改成 HCTRegisterReceiver: Function(pReceiver: PRECEIVERINFO; var pRID: RECEIVERID):HCTERR; Stdcall;
不過,再加上一個
type PRECEIVERID = ^RECEIVERID; 上去 其餘有 OUT 修飾,有傳指標進去的,都比照上例辦理
|
adonis
高階會員 發表:140 回覆:258 積分:159 註冊:2002-04-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |