能力值:
( LV12,RANK:1010 )
|
-
-
2 楼
偶一直用的封装函数
00000: ////////////////////////////////////////////////////////////////////////////////// 00001: //-------------------------------------------------------------------------------- 00002: // 作者 : sudami [xiao_rui_119@163.com] 00003: // 时间 : 07/10/6 00004: // 00005: // 函数名: ReleaseDll 00006: // 00007: // 参数: LPCTSTR szProcName --> 指定释放DLL的位置 00008: // 00009: // 返回值: TRUE / FALSE 00010: // 00011: // 函数功能: 释放DLL资源,并加载sudami.dll 00012: //-------------------------------------------------------------------------------- 00013: BOOL ReleaseDll (LPCTSTR szProcName) 00014: { 00015: DWORD dwWritten = 0; 00016: HMODULE hInstance = ::GetModuleHandle(NULL); 00017: 00018: //定位自定义资源 00019: HRSRC hRsrc = FindResource(hInstance, MAKEINTRESOURCE(IDR_DLL), TEXT("S")); 00020: if (NULL == hRsrc) 00021: { 00022: AfxMessageBox (TEXT("FindResource出错")); 00023: return FALSE; 00024: } 00025: 00026: //获取资源的大小 00027: DWORD dwDllSize = SizeofResource(NULL, hRsrc); 00028: if (0 == dwDllSize) 00029: { 00030: AfxMessageBox (TEXT("SizeofResource出错")); 00031: return FALSE; 00032: } 00033: 00034: //加载资源 00035: HGLOBAL hGlobal = LoadResource(NULL, hRsrc); 00036: if (NULL == hGlobal) 00037: { 00038: AfxMessageBox (TEXT("LoadResource出错")); 00039: return FALSE; 00040: } 00041: 00042: //锁定资源 00043: LPVOID pBuffer = LockResource(hGlobal); 00044: if (NULL == pBuffer) 00045: { 00046: AfxMessageBox (TEXT("LockResource出错")); 00047: return FALSE; 00048: } 00049: 00050: char* szServiceExePath = (LPTSTR)(LPCTSTR)szProcName; 00051: 00052: //--------------------------------------------------------- 00053: // 如果DLL已存在,直接返回 00054: if (IsFileExist(szServiceExePath)) 00055: { 00056: /******************************************************* * * * 如果sudami.dll已经存在,删除之 * * * ********************************************************/ 00057: /* ::DeleteFile (szServiceExePath); if (IsFileExist(szServiceExePath)) { CString explorer(_T("explorer.exe")); TerminateProc (explorer, TRUE); WinExec("explorer.exe",SW_HIDE); HWND hWnd = ::FindWindow (NULL, _T("我的文档")); if (hWnd != NULL) ::PostMessage(hWnd,WM_SYSCOMMAND,SC_CLOSE,0); // ::SendMessage (hWnd, WM_CLOSE, 0, 0); } */ 00058: return TRUE; 00059: } 00060: 00061: // 否则创建sudami.dll 00062: // 将DLL释放到C:\WINDOWS\System32 下 00063: HANDLE hFileForDll = ::CreateFile( 00064: szServiceExePath, 00065: GENERIC_WRITE, 00066: 0, 00067: NULL, 00068: CREATE_ALWAYS, 00069: FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM, 00070: NULL 00071: ); 00072: 00073: if (hFileForDll == INVALID_HANDLE_VALUE) 00074: { 00075: AfxMessageBox (TEXT("DLL释放出错")); 00076: 00077: return FALSE; 00078: } 00079: 00080: ::WriteFile (hFileForDll, pBuffer, dwDllSize, &dwWritten, NULL); 00081: ::CloseHandle (hFileForDll); 00082: return TRUE; 00083: }
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
是不是可以把DLL放到资源中,程序运行的时候通过这个函数再释放出来,然后程序就可以使用DLL了?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
如果你是动态连接的话,可以
|
能力值:
( LV12,RANK:1010 )
|
-
-
5 楼
嘿嘿。什么都可以放进去,然后再放出来。只要你喜欢
不过只是释放出来啦。加载是另外一回事。和什么什么动态链接木有关系。xicao同学不要误导别人哦~
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
是啊,如果他要用来注入或者替换服务之类的,太困了,没想太多
|
能力值:
( LV15,RANK:670 )
|
-
-
7 楼
在我的工程中不行呀,不知道为什么呀?
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
如果是.RES文件,如何用API打开并编辑?
|
|
|