用Microsoft Visual Studio 来创建一个应用程序项目时,集成开发环境会设置各种链接器开关,使链接器将子系统的正确类型嵌入最终生成的可执行文件(executable)中。对于 CUI(控制台用户界面)程序,这个链接器开关是/SUBSYSTEM:CONSOLE,对于GUI(图形用户界面)程序,则是 /SUBSYSTEM:WINDOWS。
在链接可执行文件时,链接器将选择正确的C/C++运行时启动函数。如果指定了/SUBSYSTEM:WINDOWS链接器开关,链接器就会寻找 WinMain或wWinMain函数。如果没有找到这两个函数,链接器将返回一个"unresolved external symbol “(无法解析的外部符号)错误;否则,它将根据具体情况分别选择WinMainCRTStartup或wWinMainCRTStartup函数。
类似的,如果指定了/SUBSYSTEM:CONSOLE开关,链接器就会寻找main或wmain函数,并根据情况分别选择 mainCRTStartup或wmainCRTStartup函数。同样地,如果main或wmain函数都没有找到,链接器会返回一个"unresolved external symbol “(无法解析的外部符号)错误。
不过,一个鲜为人知的事实是,我们完全可以从自己的项目中移除/SUBSYSTEM链接器开关。这样做的好处是,链接器会自己判断应该将应用程序设为哪个子系统。链接时,链接器会检查代码中包括4个函数中的哪一个(wMain,main,wWinMain,WinMain),并据此推算可执行文件应该是哪个子系统,以及应该在可执行文件中嵌入哪个C/C++启动函数。
不用那么麻烦,
来个例子吧
#include
int main()
{
ShellExecute(NULL, NULL, "C:\\Program Files\\LuDaShi\\ComputerZ_CN.exe", NULL, NULL,SW_SHOW);
return 0;
}
这个函数的原型是
HINSTANCE ShellExecute( HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,//要执行的文件
LPCTSTR lpParameters,//要传的参数
LPCTSTR lpDirectory,
INT nShowCmd
);
头文件在shellapi.h中,windows.h中包含了shellapi.h。
EXEC函数
你问我我问谁???