星期四, 10月 12, 2006

CE : Device Driver - DLL and GetProcAddr

msdn的文章(CE5.0 開發測試驅動程式)的筆記

CE的drvice driver只是DLL檔,Process將DLL load到memory中,就可以使用DLL中公開的API。

一般使用 LoadLibrary( ) 或 LoadDriver( ) 來load DLL,不同的是 LoadDriver( )除了將DLL load到memory外,同時還會確認DLL沒有被pageout。

將DLL Load進來後,使用 GetProcAddress( ) 來詢問需要的function存不存在,如果在,就會return 該function的address,如果不在,就return NULL。

有關 GetProcAddress : ( http://msdn2.microsoft.com/zh-tw/library/64tkc9y5(d=printer).aspx )以下就是load MyDLL進來,然後取得DLL中DLLFunc1( )這個function address的code..
HINSTANCE hDLL = LoadLibrary("MyDLL");

typedef UINT (CALLBACK *LPFNDLLFUNC1)(DWORD, UINT);
LPFNDLLFUNC1 lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,"DLLFunc1");

..
GetProcAddress( )中的第二個argument是function name,這是在module的.DEF檔中列出得的名字,如果該module export很多function,他會在DEF檔中同時列出ordinal (Index),這時可以用Index來取出address,省略掉FunctionName字串比較時花費的時間。

在 這一篇 Using exported DLL functions(http://blogs.msdn.com/peterrosser/archive/2006/02/22/ExportedDllFunctions.aspx ) 有說明用ordinal 取出function entry address的方法。

沒有留言:

網誌存檔