私の目的は、自分のプログラムで外部実行可能ファイルを実行することです。まず、system()
機能を使用しましたが、私はコンソールをユーザーに見せたくありません。だから、私はちょっと調べて、CreateProcess()
の機能を見つけました。しかし、私はそれにパラメータを渡そうとすると、私はなぜそれが失敗するのか分からない。私はMSDNからこのコードを取り出し、ビットを変更しました。CreateProcess()がアクセス違反で失敗する
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
void _tmain(int argc, TCHAR *argv[])
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
/*
if(argc != 2)
{
printf("Usage: %s [cmdline]\n", argv[0]);
return;
}
*/
// Start the child process.
if(!CreateProcess(NULL, // No module name (use command line)
L"c:\\users\\e\\desktop\\mspaint.exe", // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi) // Pointer to PROCESS_INFORMATION structure
)
{
printf("CreateProcess failed (%d).\n", GetLastError());
return;
}
// Wait until child process exits.
WaitForSingleObject(pi.hProcess, INFINITE);
// Close process and thread handles.
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
ただし、このコードは何とかアクセス違反を明らかにしました。ユーザにコンソールを表示せずにmspaintを実行できますか?
ありがとうございました。
、 'CreateProcess'は(提供された場合)その2番目のパラメータは非const文字列である必要があります。実際にはこれが問題なのかどうかはわかりませんが、完全性のために言及したいと思います。 – reuben
...そうでなければ、どこでAVが起こっていますか?コールスタックがありますか? – reuben
@reuben Uhm ...私は確信していませんが、これはコールスタックの出力であると思います: 'kernel32.dll!76da70ac()\t \t [下のフレームは正しくありませんkernel32.dllのために] \t > \t msvcr100d.dll!_nh_malloc_dbg(unsigned int型nsizeの場合、int型nhFlag、int型nBlockUse、constのchar型* szFileName、INT NLINE)線302 + 0x1Dのバイト\t C++ ' –