討論區快速選單
知識庫快速選單
傑米的攝影旅遊筆記 政府補助!學嵌入式+物聯網 程式設計俱樂部Facebook粉絲團
[ 回上頁 ] [ 討論區發言規則 ]
GetProcAddress()用法??
更改我的閱讀文章字型大小
作者 : rickyt(陽光) 人氣指數超過10000點
[ 貼文 58 | 人氣 14785 | 評價 20 | 評價/貼文 0.34 | 送出評價 17 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/8/11 上午 05:14:56
請問各位前輩~

小弟現在要動態連結使用HIDKey.dll檔裡面的OpenHid()功能,HidKey.h檔內對OpenHid()的原型定義如下

extern "C" int PASCAL EXPORT OpenHid( HWND hWnd);

使用下列程式碼來載入 HIDKey.dll
HINSTANCE hInst = ::LoadLibrary ( “HIDKey.dll” );

接著我該如何用getprocaddress來取得HIDKey.dll的位址呢??看很多前輩的例子,似乎要建立一個指標,用來儲存指向HIDKey.dll的位址用,如果是..那我該如何建立這樣的指標呢?指標的資料型態要如何決定呢?可否請知道的前輩指導一下..謝謝.. ><~

另外再請教一個問題..就是原型內"PASCAL EXPORT"代表什麼意思呢?因為我查不到?? ^^lll
作者 : nietzsche(尼采) VC++優秀好手C++優秀好手貼文超過500則
[ 貼文 501 | 人氣 3089 | 評價 2900 | 評價/貼文 5.79 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人rickyt註記此篇回應為最佳解答 2004/8/11 上午 09:40:11

>請問各位前輩~
>
>小弟現在要動態連結使用HIDKey.dll檔裡面的OpenHid()功能,HidKey.h檔內對OpenHid()的原型定義如下
>
>extern 'C' int PASCAL EXPORT OpenHid( HWND hWnd);
>
>使用下列程式碼來載入 HIDKey.dll
>HINSTANCE hInst = ::LoadLibrary ( “HIDKey.dll” );
>
>接著我該如何用getprocaddress來取得HIDKey.dll的位址呢??看很多前輩的例子,似乎要建立一個指標,用來儲存指向HIDKey.dll的位址用,如果是..那我該如何建立這樣的指標呢?指標的資料型態要如何決定呢?可否請知道的前輩指導一下..謝謝.. ><~
>
>另外再請教一個問題..就是原型內'PASCAL EXPORT'代表什麼意思呢?因為我查不到?? ^^lll


PASCAL <--- 命名方式和參數傳遞方式和 Pascal 語言相容,以便能誏 Pascal 也能使用此 dll;
EXPORT <--- 自己定義,通常開放給別人使用會定義成
#define EXPORT dllexport
// dllexport 在msdn裡查的到,目的只是誏別的程式能使用這個函式;

// 定義函式指標原型;
typedef int (*typeFN)( HWND )
// 宣告函式指標指向 OpenHid;
// 這裡的 hInst 是你在 LoadLibrary() 傳回值;
typeFN pfn= GetProcAddress( hInst, "OpenHid" );
// 執行 OpenHid;
(*pfn)( hwnd );
作者 : rickyt(陽光) 人氣指數超過10000點
[ 貼文 58 | 人氣 14785 | 評價 20 | 評價/貼文 0.34 | 送出評價 17 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/8/11 下午 04:01:06

>
>>請問各位前輩~
>>
>>小弟現在要動態連結使用HIDKey.dll檔裡面的OpenHid()功能,HidKey.h檔內對OpenHid()的原型定義如下
>>
>>extern ''C'' int PASCAL EXPORT OpenHid( HWND hWnd);
>>
>>使用下列程式碼來載入 HIDKey.dll
>>HINSTANCE hInst = ::LoadLibrary ( “HIDKey.dll” );
>>
>>接著我該如何用getprocaddress來取得HIDKey.dll的位址呢??看很多前輩的例子,似乎要建立一個指標,用來儲存指向HIDKey.dll的位址用,如果是..那我該如何建立這樣的指標呢?指標的資料型態要如何決定呢?可否請知道的前輩指導一下..謝謝.. ><~
>>
>>另外再請教一個問題..就是原型內''PASCAL EXPORT''代表什麼意思呢?因為我查不到?? ^^lll
>
>
>PASCAL <--- 命名方式和參數傳遞方式和 Pascal 語言相容,以便能誏 Pascal 也能使用此 dll;
>EXPORT <--- 自己定義,通常開放給別人使用會定義成
>#define EXPORT dllexport
>// dllexport 在msdn裡查的到,目的只是誏別的程式能使用這個函式;
>
>// 定義函式指標原型;
>typedef int (*typeFN)( HWND )
>// 宣告函式指標指向 OpenHid;
>// 這裡的 hInst 是你在 LoadLibrary() 傳回值;
>typeFN pfn= GetProcAddress( hInst, 'OpenHid' );
>// 執行 OpenHid;
>(*pfn)( hwnd );

感謝尼采前輩的指導..
我照您的方法改了..但是出現以下錯誤訊息..
cannot convert from 'int (__stdcall *)(void)' to 'int (__cdecl *)(struct HWND__ *)'
     this conversion requires a reinterpret_cast, a C-style cast or function-style cast
似乎是指標的型態宣告錯誤了..形態的決定應該是基於什麼呢??

另外若使用這種方式連結dll..在引用函數的時候..不能以函數的名稱來呼叫嗎??
作者 : archimage(archimage)
[ 貼文 85 | 人氣 5 | 評價 1280 | 評價/貼文 15.06 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人rickyt註記此篇回應為最佳解答 2004/8/11 下午 04:11:56
我寫這樣你應該就知道怎麼使用了..
typedef int (PASCAL *OpenHidPtr) ( HWND hWnd);

void CTestDlg::OnButton1()
{
HINSTANCE hInst = ::LoadLibrary( "hidkey.dll" );
OpenHidPtr proc = (OpenHidPtr) ::GetProcAddress( hInst, "OpenHid" );
if ( proc == NULL ) return;
int i = proc( m_hWnd );
     switch( i )
     {
     ...........
...
}
上面的LoadLibrary及GetProcAddress或許可以在CWinApp::InitInstance就做完切始及得到函式進入點。並在ExitInstance之中使用FreeLibrary將hInst釋放掉。
作者 : rickyt(陽光) 人氣指數超過10000點
[ 貼文 58 | 人氣 14785 | 評價 20 | 評價/貼文 0.34 | 送出評價 17 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/8/11 下午 05:43:34
感謝各位前輩的指導..
我和廠商在check過後..是場商給我的SDK本來就有問題..現在已經解決了..再次謝謝各位前輩的指導囉.. ^^
 板主 : 青衫 , Raymond
 > Visual C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++
1 青衫 11070 
2 Raymond 10090 
3 Clier 7630 
4 小約翰 2500 
5 Cog 2030 
6 coco 1870 
7 aming 1410 
8 牧童哥 1400 
9 r2109 1380 
10 Akira 1350 
Visual C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.171875