VC能否释放EXE或DLL

今天有个朋友问到VC能否释放多个EXE或DLL,我便做了个实例给他。下面是我写了个很方面的函数给大家用! Z7="on4
1、工程A要释放的程序是一个简单的MessageBox,源码如下: ?ufX3yia
view plaincopy to clipboardprint? l\HLlwYO
#include <windows.h>   A(2\Gfe
I: L}7uA[t
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )   \[>Ob
{   j_ \?ampF
    MessageBox(NULL,"资源文件释放实例!","测试",MB_OK);   #Ns]l<
    return 0;   C'wRF90
} +=V[7^K;
#include <windows.h> '1 }ybSG
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )   4GN
{ \U?$ r[P
MessageBox(NULL,"资源文件释放实例!","测试",MB_OK); <\fB+ AZ
return 0; pnpx`u;
} M SnRx*-
MmbS ["A
     编译生成MsgBox.exe,复制到工程B目录。 +NT8dd
2、工程B为基于MFC对话框程序,先插入已经存EXE(或DLL)文件到VC资源文件中,如下图: @~+W
    A、切换到资源视图,在上面单机右键: \Qgc7ev
<NYf!bx
m+a\NXWR?N
    B、单击"Import...",找到刚刚工程A编译生成的MsgBox.exe文件: l2*o@&.
(X3}&aLF
#1z/rUh`Cr
    C、设置导入的资源类型名,这个名称将是该函数的第三个参数,我们取资源类型名为EXE: `mE>h4
2N}UB=J
unB`n'L
    D、此时,资源视图中多了一个类型为:EXE,资源ID为:IDR_EXE1,如下图: !XqU'xxC
np6R\Q!&
Klj -dz
    E、增加一个按钮,添加响应事件,添加成员函数BOOL ReleaseRes(CString strFileName,WORD wResID,CString strFileType),具体代码如下: |\<L7|hb9
view plaincopy to clipboardprint? H 2JKQm_
HCURSOR CTestDlg::OnQueryDragIcon()   M->BV9
{   oWb\T 2!m
    return (HCURSOR) m_hIcon;   uefrE53
}   I R|[&}z
[e f&|Pi-
void CTestDlg::OnBtnRelease()    V)Sw\tS6g
{   C7=N`s}
    // TODO: Add your control notification handler code here   =oT4!OUf
    if(ReleaseRes("Test.exe",(WORD)IDR_EXE1,"EXE"))   ' +f(9/
        MessageBox("释放文件成功!","提示",MB_OK);   :Xs3Vh,V
    else T$"s w7<
        MessageBox("释放文件失败!","提示",MB_OK);   BIXbdo5F
}   @+7CfvM
gx.\&W b
/************************************************************************/ qH4+i STnV
/* 函数说明:释放资源中某类型的文件                                       `Jj q5:\&
/* 参    数:新文件名、资源ID、资源类型                                   B8~bx %)3T
/* 返 回 值:成功返回TRUE,否则返回FALSE    K]&i9`>N
/* By:Koma   2009.07.24 23:30                                .#}A/V.-Y
/************************************************************************/ H5(: 1
BOOL CTestDlg::ReleaseRes(CString strFileName,WORD wResID,CString strFileType)   +`7!4gxwK!
{   PXF u
    // 资源大小   G2&,R{L6w
    DWORD   dwWrite=0;         i3cMRcS;
= \M6s
    // 创建文件   0j2mTF(C
    HANDLE hFile = CreateFile(strFileName, GENERIC_WRITE,FILE_SHARE_WRITE,NULL,   uNca@xl'
                                CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);   p]qz+Z/
    if ( hFile == INVALID_HANDLE_VALUE )   q| UO]V
    {   oA8A @,-L
        return FALSE;   -b)3+#f
    }   Rm}G4Pq 
V`rxjv}!
    // 查找资源文件中、加载资源到内存、得到资源大小   K1w:JA6(
    HRSRC   hrsc = FindResource(NULL, MAKEINTRESOURCE(wResID), strFileType);   2J (nJT"
    HGLOBAL hG = LoadResource(NULL, hrsc);   ]MC5 uKn
    DWORD   dwSize = SizeofResource( NULL, hrsc);   $wbIe"|
-;Te+E_
    // 写入文件   Y?-Ef sK
    WriteFile(hFile,hG,dwSize,&dwWrite,NULL);      1@9M[_<n5
    CloseHandle( hFile );   CdMV(
    return TRUE;   P0RtS1A
} ?X Rl\V
HCURSOR CTestDlg::OnQueryDragIcon() 9m<%+ S5&
{ AmQsay#I_
return (HCURSOR) m_hIcon; ,!X:wY}dW
} E(&zH;?_
void CTestDlg::OnBtnRelease() q\<NW%KtX
{ F"QJ)F
// TODO: Add your control notification handler code here q29d=
if(ReleaseRes("Test.exe",(WORD)IDR_EXE1,"EXE")) MO|Pv j~[
   MessageBox("释放文件成功!","提示",MB_OK); rV2>;FG
else +{}p(9w@
   MessageBox("释放文件失败!","提示",MB_OK); K92M9=>
} kWs:7jiiu
/************************************************************************/ $"k1^&&E
/* 函数说明:释放资源中某类型的文件                                     Do5{t'm3
/* 参    数:新文件名、资源ID、资源类型                                 (cI@#x
/* 返 回 值:成功返回TRUE,否则返回FALSE ]\]mwvLT
/* By:Koma 2009.07.24 23:30                              / Xv@g$
/************************************************************************/ ) q/brCq
BOOL CTestDlg::ReleaseRes(CString strFileName,WORD wResID,CString strFileType) lwo,D}
{ (a~V<v"
// 资源大小 - s2Yhf
DWORD dwWrite=0;  }.=@^-JBA5
// 创建文件 (C%qA<6
HANDLE hFile = CreateFile(strFileName, GENERIC_WRITE,FILE_SHARE_WRITE,NULL, 2uMSeSx$
         CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); ?ZkVk=t?
if ( hFile == INVALID_HANDLE_VALUE ) `_"?$ v2F
{ Z'm( M[2K
   return FALSE; `qZ@eGZ z
} n:Dr< q .
// 查找资源文件中、加载资源到内存、得到资源大小 U]ZI_[\'U
HRSRC hrsc = FindResource(NULL, MAKEINTRESOURCE(wResID), strFileType); =S\ pI
HGLOBAL hG = LoadResource(NULL, hrsc); 6U]r3 Rr
DWORD dwSize = SizeofResource( NULL, hrsc); (D\`:1g
// 写入文件 8P2_/)|
WriteFile(hFile,hG,dwSize,&dwWrite,NULL);   j3>&Su>H4
CloseHandle( hFile ); ? Uhjyi
return TRUE; 5)gC<
} 1NK,:m
3、该函数是可重用类,本程序代码在VC6 + WIN SP3测试通过,运行效果如下图: .;&4'ga 4
,LL=b-Es
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值