积极答复者
怎么执行内存中exe, 请高人解答

问题
答案
-
- 已标记为答案 Daoping Liu - MSFTModerator 2010年10月15日 11:07
-
你可以运行时把文件复制到临时目录 然后删除该文件 然后运行临时文件 console例子代码如下
int main(int argc, char* argv[])
{
if (__argc == 1) {TCHAR szPathOrig[_MAX_PATH], szPathClone[_MAX_PATH];
GetModuleFileName(NULL, szPathOrig, _MAX_PATH);
GetTempPath(_MAX_PATH, szPathClone);
GetTempFileName(szPathClone, __TEXT("Del"), 0, szPathClone);
CopyFile(szPathOrig, szPathClone, FALSE);
//此处 FILE_FLAG_DELETE_ON_CLOSE表示当所有和此文件有关的句柄关闭后则删除文件(删除临时文件夹复制文件)
HANDLE hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL);
TCHAR szCmdLine[512];
//SYNCHRONIZE同步
HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE, GetCurrentProcessId());
wsprintf(szCmdLine, __TEXT("%s %d \"%s\""), szPathClone, hProcessOrig, szPathOrig);
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
CloseHandle(hProcessOrig);
CloseHandle(hfile);
}
else
{
HANDLE hProcessOrig = (HANDLE) _ttoi(__targv[1]);
WaitForSingleObject(hProcessOrig, INFINITE);
CloseHandle(hProcessOrig);
printf("%s\n",__targv[2]);//删除真实目录的文件 此时内存运行的是临时目录的文件 原形完毕后会自动删除临时文件
DeleteFile(__targv[2]);
MessageBox(NULL,"","-----------------",MB_OK);; }return(0);
}如果是带窗口程序 道理也是如此 比如在dialog程序里
InitInstance()
{
把判断语句改为 判断命令行参数 如果为空字符则 其余代码相同
if (strcmp(m_lpCmdLine , "")==0){...代码同上
}
else
{
HANDLE hProcessOrig = (HANDLE) _ttoi(__targv[1]);
WaitForSingleObject(hProcessOrig, INFINITE);
CloseHandle(hProcessOrig);
printf("%s\n",__targv[2]);//删除真实目录的文件 此时内存运行的是临时目录的文件 原形完毕后会自动删除临时文件
DeleteFile(__targv[2]);后面根对话框程序初始化代码 即原函数代码全放到这里来
AfxEnableControlContainer();
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif...剩余代码
}- 已建议为答案 evili 2010年10月13日 8:15
- 已标记为答案 Daoping Liu - MSFTModerator 2010年10月15日 11:07
全部回复
-
- 已标记为答案 Daoping Liu - MSFTModerator 2010年10月15日 11:07
-
你可以运行时把文件复制到临时目录 然后删除该文件 然后运行临时文件 console例子代码如下
int main(int argc, char* argv[])
{
if (__argc == 1) {TCHAR szPathOrig[_MAX_PATH], szPathClone[_MAX_PATH];
GetModuleFileName(NULL, szPathOrig, _MAX_PATH);
GetTempPath(_MAX_PATH, szPathClone);
GetTempFileName(szPathClone, __TEXT("Del"), 0, szPathClone);
CopyFile(szPathOrig, szPathClone, FALSE);
//此处 FILE_FLAG_DELETE_ON_CLOSE表示当所有和此文件有关的句柄关闭后则删除文件(删除临时文件夹复制文件)
HANDLE hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL);
TCHAR szCmdLine[512];
//SYNCHRONIZE同步
HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE, GetCurrentProcessId());
wsprintf(szCmdLine, __TEXT("%s %d \"%s\""), szPathClone, hProcessOrig, szPathOrig);
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
CloseHandle(hProcessOrig);
CloseHandle(hfile);
}
else
{
HANDLE hProcessOrig = (HANDLE) _ttoi(__targv[1]);
WaitForSingleObject(hProcessOrig, INFINITE);
CloseHandle(hProcessOrig);
printf("%s\n",__targv[2]);//删除真实目录的文件 此时内存运行的是临时目录的文件 原形完毕后会自动删除临时文件
DeleteFile(__targv[2]);
MessageBox(NULL,"","-----------------",MB_OK);; }return(0);
}如果是带窗口程序 道理也是如此 比如在dialog程序里
InitInstance()
{
把判断语句改为 判断命令行参数 如果为空字符则 其余代码相同
if (strcmp(m_lpCmdLine , "")==0){...代码同上
}
else
{
HANDLE hProcessOrig = (HANDLE) _ttoi(__targv[1]);
WaitForSingleObject(hProcessOrig, INFINITE);
CloseHandle(hProcessOrig);
printf("%s\n",__targv[2]);//删除真实目录的文件 此时内存运行的是临时目录的文件 原形完毕后会自动删除临时文件
DeleteFile(__targv[2]);后面根对话框程序初始化代码 即原函数代码全放到这里来
AfxEnableControlContainer();
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif...剩余代码
}- 已建议为答案 evili 2010年10月13日 8:15
- 已标记为答案 Daoping Liu - MSFTModerator 2010年10月15日 11:07