首页
社区
课程
招聘
[求助]如何用API实现将程序中的资源释放为文件,看看我写的这个函数
发表于: 2008-1-11 21:44 5875

[求助]如何用API实现将程序中的资源释放为文件,看看我写的这个函数

2008-1-11 21:44
5875
BOOL      WriteSourceFile(int  ID, char   * fType,   char   * fName)      
    {      
HRSRC       res=FindResource(NULL,MAKEINTRESOURCE(ID),fType);      
   
HGLOBAL       gl=LoadResource(NULL,res);      
LPVOID       lp=LockResource(gl);      
HANDLE       fp=CreateFile(fName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);      
    DWORD       a;      
    if       (!WriteFile(fp,lp,SizeofResource(NULL,res),&a,NULL))      
    {      
    return       false;      
    }      
    else      
    {      
    CloseHandle(fp);      
    FreeResource(gl);      
    return       true;      
    }      
    }
为什么res=FindResource(NULL,MAKEINTRESOURCE(ID),fType);的值会是NULL呢?
要怎么改呀?有谁能用API函数实现我要的功能,不能用MFC类,只用API!!!!!!!!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 709
活跃值: (2420)
能力值: ( 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: }
2008-1-11 21:56
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
是不是可以把DLL放到资源中,程序运行的时候通过这个函数再释放出来,然后程序就可以使用DLL了?
2008-1-11 23:42
0
雪    币: 243
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
如果你是动态连接的话,可以
2008-1-12 06:55
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
5
嘿嘿。什么都可以放进去,然后再放出来。只要你喜欢

不过只是释放出来啦。加载是另外一回事。和什么什么动态链接木有关系。xicao同学不要误导别人哦~
2008-1-12 07:11
0
雪    币: 243
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
是啊,如果他要用来注入或者替换服务之类的,太困了,没想太多
2008-1-12 08:00
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
7
在我的工程中不行呀,不知道为什么呀?
2008-1-12 14:38
0
雪    币: 212
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
如果是.RES文件,如何用API打开并编辑?
2008-2-20 17:01
0
游客
登录 | 注册 方可回帖
返回
//