在ActiveX控件中如何動態調用在資源中的DLL函數之"準"一體化方法

從徐兄(徐景周)那裏得到一段《如何直接運行一個資源中的程序》的小技巧,就想到把以前寫的《在ActiveX控件中如何動態調用DLL函數》功能修改一下,由於前些時間有點事。所以一直到現在才寫出來和大家討論。

基本思路:

1、把DLL做爲資源加入到ActiveX中。

2、在網頁加載ActiveX時,先提取出資源,臨時存在系統目錄中(可能還有更好的方法,但我現在還沒有找到)。

3、在用動態調用動態庫的方法加載臨時生成的動態庫。

4、調用動態庫中的函數。

5、當退出網頁時,刪除臨時動態庫。

其思路簡單,但不知這樣方法的用處大不大。因我不是做WEB方面開發的。

現在對關鍵地方進行少量說明:

一、提取資源內容生成臨時文件

HGLOBAL hRes;
HRSRC hResInfo;
//尋找EXE資源名
hResInfo = ::FindResource(g_hInstance,(LPCSTR)IDR_DLL1,"DLL");
hRes = ::LoadResource(g_hInstance,hResInfo ); // Load it
DWORD dFileLength = ::SizeofResource(g_hInstance, hResInfo ); 
//創建DLL文件
char pPath[MAX_PATH];
GetSystemDirectory(pPath, MAX_PATH);

strcpy(g_pFile, pPath);
strcat(g_pFile, "//ExpDll1.Dll");
HANDLE hFile = CreateFile(g_pFile, GENERIC_WRITE | GENERIC_READ,
        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_NEW, 
        FILE_ATTRIBUTE_NORMAL,NULL);
DWORD dwNumberOfBytesWritten = 0;
if(hFile > 0)
     WriteFile(hFile, (LPCVOID)hRes, dFileLength, &dwNumberOfBytesWritten,   NULL);
else
	MessageBox("加載Res不成功","提示信息",MB_OK);
CloseHandle(hFile);

二、導入臨時生成的DLL函數

hDll = ::LoadLibrary(g_pFile);
if(hDll != NULL)
fun = (void(__stdcall *)(void))(GetProcAddress(hDll, "ExpShowMsg"));
else
MessageBox("加載DLL不成功","提示信息",MB_OK);

三、釋放DLL並刪除臨時DLL文件

//釋放DLL
::FreeLibrary(hDll);
//刪除DLL文件
::DeleteFile(g_pFile);

就這麼容易。如果還有不清的地方,老兄你就看源程序吧!如果老兄有方法去掉那個“準”字,請給我說一下方法。在下在這裏先謝了。
注:源程序中一個目錄是Active源程序,另一個是DLL源程序。
要註冊控件後方可運行. 環境:VC6 + Win2000+FrontPage2000

用regsvr32 ExpATL1.dll註冊後才能運行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章