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

請教一個 C 的語法轉換

缺席
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-30 16:32:39 IP:210.201.xxx.xxx 未訂閱
各位前輩 請問 -- typedef void (*PFNHCTNOTIFY)( UINT nNotify, DWORD dwData ); 若以 Delphi 方式宣告該如何表示? 謝謝。
------
我也在努力學習中,若有錯謬請見諒。
wyndog
資深會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-30 17:53:20 IP:60.248.xxx.xxx 未訂閱
type
  PFNHCTNOTIFY = procedure (nNotify, dwData: Cardinal); stdcall;
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-30 20:03:36 IP:61.62.xxx.xxx 未訂閱
reptile, 謝謝您的回應 可我不明白的是 (*PFNHCTNOTIFY) 其 * 不用去理會它嗎?C 的 * 不是用來表示指標的嗎? 如果說是:typedef void PFNHCTNOTIFY( UINT nNotify, DWORD dwData ); 那改寫成: type PFNHCTNOTIFY = procedure (nNotify, dwData: Cardinal); stdcall; 是沒問題的,但是總覺得 "*" 這邊怪怪的 .. ?不需要特別的改寫什麼嗎?
------
我也在努力學習中,若有錯謬請見諒。
wyndog
資深會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-01 09:08:46 IP:60.248.xxx.xxx 未訂閱
C 裡頭,是因為要加個 * 變指標 才能指向那個函數 Delphi 裡頭,因為它會幫我們處理 所以不用特地宣告成指標型式
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-01 12:02:02 IP:210.201.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-01 14:08:33 IP:60.248.xxx.xxx 未訂閱
引言:
#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;
引言:
#ifdef HCT_EXPORTS
#define HCTAPI __declspec(dllexport) WINAPI
#else
#define HCTAPI __declspec(dllimport) WINAPI
#endif
這一段就不太要理了,原則上,就是在 function 的後面加 stdcall; 就行了
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-01 19:54:12 IP:61.62.xxx.xxx 未訂閱
reptile前輩, 謝謝您熱心的回應 ~    但著實有太多不明白的地方,若這樣一一的詢問怕您會煩,所以我將其 .h 檔放置站內,如下連結: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=74271 希望您不要介意,您熱心的回應著實讓我獲益,對仍不明白的地方,望您解惑,謝謝。
------
我也在努力學習中,若有錯謬請見諒。
wyndog
資深會員


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-02 11:45:03 IP:60.248.xxx.xxx 未訂閱
http://www.drbob42.com/tools/headconv.htm 其實這裡就有工具可以幫你把 C Header 轉成 Pascal 了 試試看吧,不過,我用起來的感覺是差強人意 所以,我都是自己轉的 我把一些要注意的地方,貼在下帖 還有什麼問題再提出來吧
wyndog
資深會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-07-02 11:46:02 IP:60.248.xxx.xxx 未訂閱
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, >> 就是 SHL
12.
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-07-02 16:31:19 IP:61.62.xxx.xxx 未訂閱
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-07-02 16:59:34 IP:60.248.xxx.xxx 未訂閱
引言: 再請教 一、 #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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-07-02 17:48:11 IP:61.62.xxx.xxx 未訂閱
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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-07-02 18:25:21 IP:60.248.xxx.xxx 未訂閱
引言: 再請教 #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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-07-03 13:11:12 IP:61.64.xxx.xxx 未訂閱
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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-07-04 09:52:24 IP:60.248.xxx.xxx 未訂閱
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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-07-04 10:23:35 IP:210.201.xxx.xxx 未訂閱
reptile, 您好 謝謝您熱心的回應並不厭其煩的指導,若仍有不明白之處再向您請教, 謝謝。
------
我也在努力學習中,若有錯謬請見諒。
系統時間:2024-03-29 17:52:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!