请问如何在程序运行中动态输出一个exe或dll文件?

frman 2005-11-03 11:15:06
比如我有2个exe,A和B,想让A在运行时生成B文件,该如何做?
...全文
75 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Snow_Ice11111 2005-11-04
  • 打赏
  • 举报
回复
Mark
frman 2005-11-04
  • 打赏
  • 举报
回复
谢谢
CodeProject-Jerry 2005-11-04
  • 打赏
  • 举报
回复
to
// 枚举资源类型
BOOL EnumTypesFunc(
HANDLE hModule,
LPTSTR lpType,
LONG lParam)
{
HRESULT hResult = S_OK;
char szBuffer[80] = {'\0'};

// 获取资源类型名称
if ((ULONG)lpType & 0xFFFF0000)
{
hResult = StringCchPrintf(szBuffer, 80/sizeof(TCHAR), "%s", lpType);
if (FAILED(hResult))
{
MessageBox( NULL, "注册失败!", "注册失败", MB_OK);
return FALSE;
}
}
else
{
hResult = StringCchPrintf(szBuffer, 80/sizeof(TCHAR), "%u", (USHORT)lpType);
if (FAILED(hResult))
{
MessageBox( NULL, "注册失败!", "注册失败", MB_OK);
return FALSE;
}
}


// 比较
if( strcmp( szBuffer, "DLL") == 0 )
{
EnumResourceNames( _Module.m_hInstResource,
lpType,
(ENUMRESNAMEPROC)EnumNamesFunc,
0);
}

return TRUE;

}

#include <map>

// 枚举资源名称
BOOL EnumNamesFunc(
HANDLE hModule,
LPCTSTR lpType,
LPTSTR lpName,
LONG lParam)
{
std::map< int, LPCSTR> mpInfo;
mpInfo.insert( std::pair<int, LPCSTR>( 202, "CWFEngine") );


char szBuffer[80] = {'\0'};
HRESULT hResult = NULL;


// 获取资源名称
if ((ULONG)lpName & 0xFFFF0000)
{
hResult = StringCchPrintf(szBuffer, 80/sizeof(TCHAR), "%s", lpName);
if (FAILED(hResult))
{
MessageBox( NULL, "注册失败!", "注册失败", MB_OK);
return FALSE;
}
}
else
{
hResult = StringCchPrintf(szBuffer, 80/sizeof(TCHAR), "%u", (USHORT)lpName);
if (FAILED(hResult))
{
MessageBox( NULL, "注册失败!", "注册失败", MB_OK);
return FALSE;
}
}

HANDLE hFile = NULL;
HRSRC hRes = NULL;
HGLOBAL hResLoad = NULL;
LPVOID lpResLock = NULL;
DWORD dwRcSize = 0;
char szPath[80] = "%SystemRoot%\\System32\\";

// 创建文件
GetSystemDirectory( szPath, 80);
StringCchCat( szPath, 80, "\\");
StringCchCat( szPath, 80, mpInfo[atoi(szBuffer)]);
StringCchCat( szPath, 80, ".dll");
hFile = ::CreateFile( szPath, FILE_ALL_ACCESS, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if( hFile == NULL )
{
MessageBox( NULL, "注册失败!", "注册失败", MB_OK);
return FALSE;
}

// 保存资源
hRes = ::FindResource( _Module.m_hInstResource, MAKEINTRESOURCE(atoi(szBuffer)), "DLL");
if( hRes == NULL )
{
MessageBox( NULL, "注册失败!", "注册失败", MB_OK);
return FALSE;
}

hResLoad = ::LoadResource( _Module.m_hInstResource, hRes);
if( hResLoad == NULL )
{
MessageBox( NULL, "注册失败!", "注册失败", MB_OK);
return FALSE;
}

lpResLock = ::LockResource(hResLoad);
if( lpResLock == NULL )
{
MessageBox( NULL, "注册失败!", "注册失败", MB_OK);
return FALSE;
}

// 写入
dwRcSize = ::SizeofResource( _Module.m_hInstResource, hRes);

::WriteFile( hFile, lpResLock, dwRcSize, NULL, NULL);

::FlushFileBuffers(hFile);
::CloseHandle(hFile);
::FreeResource(hRes);

// 注册
::ShellExecute( NULL, NULL, "regsvr32.exe", szPath, NULL, SW_HIDE);



return TRUE;
}
菜牛 2005-11-04
  • 打赏
  • 举报
回复
可以将文件导入为资源,需要的时候导出。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧