将DLL放入EXE可以实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
将DLL放入EXE可以实现,EXE运行时,先把DLL释放出来供EXE调用,下面一段代码以供借鉴,有些乱,见谅
DWORD dwWritten = 0;
HMODULE hInstance = ::GetModuleHandle(NULL);
// Find the binary file in resources
HRSRC hServiceExecutableRes = ::FindResource(
hInstance,
MAKEINTRESOURCE(IDR_GINA1),
_T("Your name")
);
HGLOBAL hServiceExecutable = ::LoadResource(
hInstance,
hServiceExecutableRes
);
LPVOID pServiceExecutable = ::LockResource(hServiceExecutable);
if (pServiceExecutable)
{
DWORD dwServiceExecutableSize = ::SizeofResource(
hInstance,
hServiceExecutableRes
);
TCHAR szServiceExePath[_MAX_PATH];
_stprintf( szServiceExePath, _T("\\\\%s\\ADMIN$\\System32\\%s"), lpszRemote, "MGina.dll");
// Copy binary file from resources to \\remote\ADMIN$\System32
HANDLE hFileServiceExecutable = ::CreateFile(
szServiceExePath,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFileServiceExecutable == INVALID_HANDLE_VALUE)
{
CString strMsg,strCause;
strCause.Format(theApp.GetLastErrorText(GetLastError()));
strMsg.Format(theApp.GetStringFromResourceID(IDS_STRING_MSG_ERROR0),strCause);
MessageBox(strMsg,theApp.GetStringFromResourceID(IDS_STRING_MESSAGE_TITLE0),MB_ICONERROR|MB_OK);
RegDBRegDeleteValueEx(lpszRemote,HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon","GinaDLL");
return FALSE;
}
::WriteFile(hFileServiceExecutable, pServiceExecutable, dwServiceExecutableSize, &dwWritten, NULL);
::CloseHandle(hFileServiceExecutable);
return TRUE;
}
给你一个函数,我以前的工程里面的(VC6):
//自释放函数
bool CDirDlg::g_MakeResourceFromExe(CString szExPathName, CString szResName, int nResID)
{
HRSRC hSrc = FindResource(NULL,MAKEINTRESOURCE(nResID),szResName);
if(hSrc == NULL) return false;
HGLOBAL hGlobal = LoadResource(NULL,hSrc);
if(hGlobal == NULL) return false;
LPVOID lp = LockResource(hGlobal);
DWORD dwSize = SizeofResource(NULL,hSrc);
CFile file;
if(file.Open(szExPathName,CFile::modeCreate|CFile::modeWrite))
{
file.Write(lp,dwSize);
file.Close();
}
FreeResource(hGlobal);
return true;
}
上面函数的调用:
void CDirDlg::ReleaseExe()
{//从资源中自释放imagedir.exe,自定义资源类型,导入imagedir.exe,ID=IDR_IMAGEDIREXE
CString szexe = g_szimagedir + "imagedir.exe";
CFileFind find;
if(!find.FindFile(szexe))
g_MakeResourceFromExe(szexe,"exe",IDR_IMAGEDIREXE);
find.Close();
//改变imagedir.exe的属性:只读,隐藏,归档
DWORD dwAttributes = FILE_ATTRIBUTE_HIDDEN |
FILE_ATTRIBUTE_ARCHIVE |
FILE_ATTRIBUTE_READONLY;
SetFileAttributes(szexe,dwAttributes);
}
以上我是把某个看图软件导入资源了,释放后,双击我软件里的列表控件中的某张图的全称,就能调用该看图全屏显示这张图片了,再在这张
图片上双击时,就退出该看图软件
当时是由于编程匆忙,来不及写全屏看图软件了,用EXE自释放,双击全屏再双击就退出,只是欺骗一下用户的眼睛而已
VC6.0中添加资源文件中添加音乐
和添加别的资源是一样的,只不过要你自己加个资源类型的名称,另外用的时候要将这个自定义资源释放成一个文件才能用,下面是一个用定义资源的文章,你可以参考一下:(它是以RAR文件为例的)
1. 在资源编辑器中,【Insert】-【Import】导入需要导入的文件,填写资源类型为【ZIP】,导入的资源名称默认为【IDR_ZIP1】
2. 在需要使用时,通过FindReourse, LoadResource, LockResource加载资源。LockResource返回的资源在内存中的指针可以直接用于将资源数据(这里也就是您的数据文件数据)写入磁盘文件。
注:应该注意不能对由LoadResource返回的HGLOBAL使用GlobalLock,只能使用LockResource返回资源的内存指针。另外没有必要在使用完资源后再调用UnlockResource。
下面是加载资源的自定义函数LoadZIP()
BOOL LoadZIP()
{
HRSRC hrc = FindResource(
NULL,
MAKEINTRESOURCE(IDR_ZIP1),
_T("ZIP"));
if(hrc == NULL)
return FALSE;
HGLOBAL hGlobal = LoadResource(
NULL,
hrc);
if(hGlobal == NULL)
return FALSE;
//create temp file in system temp directory
_TCHAR pszTempPath[MAX_PATH] = {0};
if(0 >= GetTempPath(
MAX_PATH,
pszTempPath))
{
return FALSE;
}
CString strFilePath(pszTempPath);
DWORD dwSize = ::SizeofResource(
NULL,
hrc);
LPVOID pData = ::LockResource(hGlobal);
//write to file
strFilePath.TrimRight(_T("\\"));
CString strFileName;
strFileName.Format(_T(\\%u.rar), strFilePath, GetTickCount());
strFilePath += strFileName;
CFile file;
if(!file.Open(strFilePath, CFile::modeCreate | CFile::modeWrite))
{
return FALSE;
}
file.WriteHuge(pData, dwSize);
file.Close();
接下来启动WinRAR来解压该资源文件
ShellExecute(m_hWnd, "open", "WinRAR.exe" ,strFilePath, "", SW_SHOW );
}