2008年3月24日 星期一

VC++ 連結器設定

若是 /SUBSYSTEM:WINDOWS

代表是選擇 GUI : based on graphic user interface
其 Startup function : (w)WinMainCRTStartup 會呼叫 (w)WinMain(...)
PS: 會去找是否有 WinMain(...), 還是有 wWinMain(...)來決定Startup function

也可以使用 /subsystem:windows /entry:WinMainCRTSartup 來指定要呼叫
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);

或 /subsystem:windows /entry:wWinMainCRTSartup 來指定要呼叫
int wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow);

或者只有/subsystem參數時,使用
int _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)這個巨集,
並以_UNICODE或者_MBCS的定義,來決定是WinMain(...)或wWinMain(...)


PS:這裡的定義,是指加在編譯器的設定上,如 /D "_UNICODE" 或/D "_MBCS"

若是 /SUBSYSTEM:CONSOLE

代表是選擇 GUI:based on console user interface
其 Startup function : (w)mainCRTStartup 會呼叫(w)main(...)
PS: 會去找是否有 main(...), 還是有 wmain(...)來決定Startup function

也可以使用 /sybsystem:console /entry:mainCRTSartup 來指定要呼叫int main(int argc, char* argv[] )

或 /sybsystem:console /entry:wmainCRTSartup 來指定要呼叫int wmain(int argc, wchar_t* argv[])

或者只有/subsystem參數時,使用int _tmain(int argc, _TCHAR* argv[])這個巨集,
並以_UNICODE或者_MBCS的定義,來決定是main(...)或wmain(...)


PS:這裡的定義,是指加在編譯器的設定上,如 /D "_UNICODE" 或/D "_MBCS"


#pragma comment( linker, "/subsystem:"windows" /entry:"mainCRTStartup"" )
也可以用這樣的方式寫在程式裡,來設定連結器的參數

一個題目:如何隱藏win32 console application的console視窗 ?
int main(int argc, char* argv[])
{
MessageBox(NULL, "hello", "Notice", MB_OK);
return 0;
}

可以使用#pragma comment( linker, "/subsystem:"windows" /entry:"mainCRTStartup"" )
PS:開發環境的設定/entry 和 /subsystem 必須拿掉

或者在開發環境的
project->setting->link->project option中手工更改

測試結果:
在VC6.0裡,使用pragma的方式,仍然會帶出一個cosole視窗
相關連結:
請問如何隱藏win32 console application的console視窗 ?
http://jackbin.blog.edu.cn/user1/21000/archives/2005/231856.shtml

沒有留言:

張貼留言