如何把EXE文件封装到DLL文件中

AbnerChai 2010-03-22 10:20:51
我有一个单独的程序a.exe,有源代码,基于MFC编写的,有图形界面,该程序是可以单独运行的。
我还有另外一个程序b.exe,也有源代码,可以编译,也是基于MFC编写的,也有图形界面,也可以单独运行。
现在我的需求是,在b.exe中,点一个按钮,就启动执行a.exe,但是我不想在发布的时候将a.exe一起发布,我想将a.exe编译成一个dll文件封装起来,成为b.exe的一部分。请问有没有办法,如何搞?多谢
...全文
1006 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2010-04-06
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 nooning 的回复:]
做为 变量就可以了,这种方式最简单

但要写个小程序,生成以下格式
byte x[] = {1,2,3,4,5,6,8};

要运行writefile
exec
[/Quote]
这样不太好吧,要是这样的话,释放出来的进程非法关闭的话,这个文件就不会写了,最好的是等待该进程的内核对象的句柄。WaitForSingleObject(hProcess, INFINITE);
nooning 2010-04-06
  • 打赏
  • 举报
回复
做为 变量就可以了,这种方式最简单

但要写个小程序,生成以下格式
byte x[] = {1,2,3,4,5,6,8};

要运行writefile
exec
klkvc386 2010-04-02
  • 打赏
  • 举报
回复
Mark................
sunlin7 2010-04-01
  • 打赏
  • 举报
回复
可以給釋放出來的臨時文件加個刪除標記,等所有使用這個文件的句柄都關閉後文件就會被刪除了。
muzizongheng 2010-03-30
  • 打赏
  • 举报
回复
没那么麻烦, exe不就是2进制文件吗, 把它直接作为自定义格式添加到资源里. 调用的时候, 创建文件把此资源写进去就行了.
AbnerChai 2010-03-29
  • 打赏
  • 举报
回复
请问按6楼的方式怎么解决删除释放文件的问题。就是:我无法知道释放出来的exe文件什么时候执行结束。
这样我可以删除它。下次就不用重新释放了。如何删除?
AbnerChai 2010-03-29
  • 打赏
  • 举报
回复
6楼的方法可以执行,但是有个问题就是:我无法知道释放出来的exe文件什么时候执行结束。
这样我可以删除它。下次就不用重新释放了。
AbnerChai 2010-03-29
  • 打赏
  • 举报
回复
我正在试6楼的方法。回头结贴。多谢。
hzy694358 2010-03-25
  • 打赏
  • 举报
回复
6楼方法,作为资源,执行的时候释放,运行,
哈利路亚1874 2010-03-25
  • 打赏
  • 举报
回复
就作为资源了
yeajay 2010-03-25
  • 打赏
  • 举报
回复
就按你说的那样搞应该就可以吧,把a.exe做为资源加载到dll中,b.exe调用dll的某个导出函数,在dll的导出函数中将a.exe释放出来,然后在调用a.exe就可以吧。
我这里有个将资源中的文件释放出来的函数,希望对你有用。

//将指定资源释放到指定目录下生成特定文件,restype为资源中的类型
BOOL CMyDlg::FreeMyData(LPCTSTR ResName, LPCTSTR ResType, LPCTSTR FileName, int Type)
{
BOOL bRet = TRUE;
HINSTANCE hInst = AfxGetInstanceHandle();

//先判断我们指定的资源是否存在
HRSRC hResInfo = FindResource(hInst,ResName,ResType);

if(hResInfo == NULL)
return FALSE;

HANDLE hFile = NULL;
DWORD dwWritten = 0;

//开始调入指定的资源到内存
HGLOBAL hResData = LoadResource(hInst,hResInfo);
LPVOID pvResData = LockResource(hResData);
DWORD dwResSize = SizeofResource(hInst,hResInfo);

//再创建目标文件并保存数据至文件
if(Type == 1)//系统加隐藏属性 如果指定类型为1,那么加上系统和隐藏属性,防止普通用户对文件进行破坏
{
hFile = CreateFile(FileName,GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM, NULL);
WriteFile(hFile, pvResData, dwResSize, &dwWritten, NULL);
}
else
{
hFile = CreateFile(FileName,GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hFile, pvResData, dwResSize, &dwWritten, NULL);
}
if(hFile == INVALID_HANDLE_VALUE)//创建文件失败
{
FreeResource(hResData);
// AfxMessageBox("创建文件失败,请将所有超市客户端关闭后再重试");
// return FALSE;
}

//释放有关内存资源
CloseHandle(hFile);
FreeResource(hResData);

return TRUE;
}



//使用例子,你要先将a.exe import到资源中 类型是EXE,名字为IDR_AEXE
if (! FreeMyData(MAKEINTRESOURCE(IDR_AEXE),"EXE","D:\\A.EXE",2))
return FALSE;

康斯坦汀 2010-03-23
  • 打赏
  • 举报
回复
可以改造a啊,去掉主程序类、框架类文档类,把其中的代码合并到b相同的类中,
然后用MFC扩展DLL的方式输出a的类,都可以封装到DLL了,这样就是真正的
DLL文件。不过需要些时间改造。肯定可行。
这不是鸭头 2010-03-23
  • 打赏
  • 举报
回复
用扩展dll,我现在就是这样做。
sunlin7 2010-03-22
  • 打赏
  • 举报
回复
本人写过一个RawPeApi的库,可以满足楼主的要求,呵呵
http://blog.csdn.net/lisunlin0/archive/2007/08/17/1748173.aspx
AbnerChai 2010-03-22
  • 打赏
  • 举报
回复
2楼的能说详细点吗?
做为什么样的资源?然后怎么加载,运行?
yxwsbobo 2010-03-22
  • 打赏
  • 举报
回复
可以直接把A作为B的资源方在一起

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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