[問題] *handle的用法?

作者: sv39933993 (^^)   2014-08-14 00:03:46
小弟是C++剛入門的新手,最近在研究一個呼叫DLL的程式,
爬了文也google過,想了很久但還是有些地方不太了解。
希望各位大大給點意見.
程式碼:
typedef void *DEV_HANDLE; //line 1
DEV_HANDLE WINAPI Device_xOpen(const int nDevIndex); //line 2
typedef DEV_HANDLE (WINAPI *LP_DevOpen)(const int nDevIndex,
const char *pDevName); // line 3
DEV_HANDLE m_hLink; // line 4
LP_DevOpen m_Open; // line 5
m_Open = (LP_DevOpen)::GetProcAddress(hDLL, "Device_xOpen"); // line 6
m_hLink = m_Open(0, ""); // line 7
if (m_hLink){ ......} // line 8
疑問:
1. DEV_HANDEL為指標型式,所以 line 2 的意思是函式Device_xOpen的回傳值
是一個位址嗎?
2. 如果"函式Device_xOpen的回傳值是一個位址",
那為何line 7, line 8 看起來 m_hLink 是一個值?
3. Device_xOpen函式的輸入值只有一個nDevIndex,
經過了line 3, line 6可以多出一個pDevName的原因是?
pDevName在原本的Device_xOpen沒有,它代表的是甚麼呢?
4. 雙冒號::是用在表示Class裡的函式或是變數,
但line 6 中的(LP_DevOpen)::GetProcAddress雙冒號的用意是?
5. 雙冒號::另一問,程式碼:
HINSTANCE hInst = ::LoadLibrary ( “HIDKey.dll” );
這裡的雙冒號的用意是?
C++真的比想像中的還有學問 >_<
作者: LPH66 (-6.2598534e+18f)   2014-08-14 00:07:00
4 5 的 :: 同義, 指不在任何 class/namespace 裡的名字4 前面的 () 只是把函式結果轉型而已
作者: Bencrie   2014-08-14 00:08:00
:: 前面沒東西表示 global
作者: LPH66 (-6.2598534e+18f)   2014-08-14 00:09:00
1 2 可參看我的文章 #1I6t3pwd
作者: sv39933993 (^^)   2014-08-14 00:21:00
"指不在任何 class/namespace 裡的名字"的意思是甚麼?Bencrie大大 global是::後面的東西是global嗎?
作者: keeper7478 (the Servant of Cthulhu)   2014-08-14 02:01:00
精確的說是 anonymous namespace
作者: LPH66 (-6.2598534e+18f)   2014-08-14 05:46:00
不是 anonymous namespace, 是 global namespaceanonymous namespace 裡的東西只能直接用名字(要換一講法叫做 unnamed namespace 也行)
作者: sv39933993 (^^)   2014-08-14 10:11:00
感謝keeper7478, LPH66大大的回答,我消化一下@@::GetProcAddress雙冒號指的GetProc是global namespac而不在任何Class/namespace裡宣告的名字是嗎?
作者: LPH66 (-6.2598534e+18f)   2014-08-14 14:49:00
我講的「不在任何 class/namespace 裡」就是 global一個 :: 前面沒有名字就是代表這樣的意義
作者: Bencrie   2014-08-14 15:44:00
其實可以改成寫 C,反正全部都 Win32 SDK 的東西 XD
作者: keeper7478 (the Servant of Cthulhu)   2014-08-14 22:47:00
to原po:LPH66講的才是對的,我搞錯了,我不曉得原來還有global namespace 這東西 XD
作者: sunneo (艾斯寇德)   2014-08-16 22:09:00
win_api的命名方式真的銷魂 T_T

Links booklink

Contact Us: admin [ a t ] ucptt.com