close
文章出處

來至:http://bbs.mini188.com/showtopic-161.aspx
前段時間寫了一個讀卡器程序,使用到了一個DLL。在.NET 中調用DLL還是相當簡單的。我也是轉別人的代碼,自己的不寫。下面就是代碼:

C#中要使用動態鏈接庫中的導出函數,只能在程序中根據DllAtribute顯示調用,無法在運行階段動態加載,但是我們可以利用WIN32 API的LoadLibrary和FreeLibrary打到目的,問題是根據GetProcAddress()函數獲取到的導出函數的地址無法在C#中利用,網上很多方法多是利用對函數調用棧的操作來達到在C#中操作的目的.    其實如果導出函數沒有返回值,完全可以利用另一個API函數達到動態綁定DLL庫的目的:

 
LRESULT CallWindowProc( WNDPROC lpPrevWndFunc,
    HWND hWnd,
    UINT Msg,
    WPARAM wParam,
    LPARAM lParam
);


如果導出函數無形參也無返回值的話,可以直接調用CallWindowProc(FunctionName,0,0,0,0),如果我們需要向導出函數傳遞簡單參數的話,也可以自定義一個消息,用消息封裝實參。
[DllImport("kernel32")]
public extern static int LoadLibrary(string lpLibFileName);
[DllImport(
"kernel32")]
public extern static bool FreeLibrary(int hLibModule);
[DllImport(
"kernel32", CharSet=CharSet.Ansi)]
public extern static int GetProcAddress(int hModule, string lpProcName);
[DllImport(
"user32", EntryPoint="CallWindowProc")] 
public static extern int CallWindowProc(int lpPrevWndFunc, int hwnd, int MSG, int wParam, int lParam);

private void button1_Click(object sender, System.EventArgs e)
{
int hmod=LoadLibrary("*****.dll");
int pFname=GetProcAddress(hmod, "*****");
CallWindowProc(pFname,
0,0,0);
FreeLibrary(hmod);
}

不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 AutoPoster 的頭像
    AutoPoster

    互聯網 - 大數據

    AutoPoster 發表在 痞客邦 留言(0) 人氣()