Trao đổi với tôi

http://www.buidao.com

10/12/10

[VC++] Các cách để thực thi file và tạo Process Mới

Author: peterdrew
Có khá nhiều cách để các bạn có thể thực thi một process; sau đây Peter xin được đưa ra (Có khi có những cách chưa thấy các bạn áp dụng bao giờ), có gì các bạn bổ sung thêm:

1. Với C run-time libraries:

- Cách 1: Dùng hàm system() của stdlib để gọi một process; ví dụ như sau:
PHP Code:
system("notepad");
và khi câu lệnh thực thi thì cửa sổ Notepad sẽ bay vù ra! Hì, chưa ai dùng đúng không??

- Cách 2: Dùng _exec() của process; hãy tham khảo tại http://msdn.microsoft.com/en-us/libr...8VS.60%29.aspx; do quá dài và nhiều vấn đề liên quan nên Peter cung cấp link cho các bạn qua đó lấy.

- Cách 3: Dùng _spawn(); tham khảo nó tại http://msdn.microsoft.com/en-us/libr...8VS.80%29.aspx

2. Với Win32 API:

- Cách 1: Dùng WinExec(); chắc các bạn quá quen thuộc với hàm này???

- Cách 2: Sử dụng CreateProcess(), dùng để khởi tạo một process chạy trong ngữ cảnh của process được gọi:
PHP Code:
STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

// Start the child process.
BOOL bRetVal = ::CreateProcess( "notepad.exe",
NULL, // 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.
);

- Cách 3: Sử dụng CreateProcessAsUser();... các bạn hãy tham khảo tại MSDN.

- Cách 4: Dùng CreateProcessWithLogonW; cũng tham khảo tại MSDN nhé....

3. Với Shell API:

- Cách 1: Dùng hàm ShellExecute():
PHP Code:
HINSTANCE result = ShellExecute(NULL, "open", "c:\\windows\\notepad.exe", NULL,NULL, SW_SHOW);
- Cách 2: Dùng hàm ShellExecuteEx():
PHP Code:
SHELLEXECUTEINFO ExecuteInfo;

memset(&ExecuteInfo, 0, sizeof(ExecuteInfo));

ExecuteInfo.cbSize = sizeof(ExecuteInfo);
ExecuteInfo.fMask = 0;
ExecuteInfo.hwnd = 0;
ExecuteInfo.lpVerb = "open";
ExecuteInfo.lpFile = "notepad.exe"
ExecuteInfo.lpParameters = NULL;
ExecuteInfo.lpDirectory = 0;
ExecuteInfo.nShow = SW_SHOW;
ExecuteInfo.hInstApp = 0;

ShellExecuteEx(&ExecuteInfo);

Trên Windows, tất cả đều là wrapper của CreateProcessA/W hay CreateProcessInternalA/W hết. Debug vào hay trace vào source của C RTL cùa compiler các bạn đang dùng sẽ thấy.
Còn rất nhiều hàm nữa, bạn nào tìm ra ? Đặc biệt một hàm mà ai từng code trên Win16-Win9x sẽ biết ? Tới giờ nó vẫn chạy tốt!

VD kỹ thuật trên dùng CreateProcess(...,CREATE_SUSPEND,....), VirtualAllocEx, ResumeThread, WriteProcessMemory, NtUnmapViewOfSection...