從徐兄(徐景周)那裏得到一段《如何直接運行一個資源中的程序》的小技巧,就想到把以前寫的《在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註冊後才能運行