转眼c已经放下N+1年了,去年就想拾起来,一直拖到了现在,幸亏基本语法尚未忘记。写此blog以鼓励和监督自己:
核心编程第一章[程序错误处理]:在此需要感谢/kf§口吕品提供的帮助,好淫呐!
以前看此章基本略过,现在因为是真要学习,所以...
int WINAPI _tWinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) {
HWND hwnd = FindWindow(TEXT("#32770"), TEXT("Error Show"));
if (IsWindow(hwnd)) {
// An instance is already running, activate it and send it the new #
SendMessage(hwnd, ESM_POKECODEANDLOOKUP, _ttoi(pszCmdLine), 0);
} else {
DialogBoxParam(hinstExe, MAKEINTRESOURCE(IDD_ERRORSHOW),
NULL, Dlg_Proc, _ttoi(pszCmdLine));
}
return(0);
}
此代码J君写的的确简略,启动函数int WINAPI _tWinMain(),启动后检测有无实例运行(FindWindow()),然后(IsWindow(hwnd))判断,有则传递参数,无则创建窗体,其中创建窗体十分特别,用了DialogBoxParam(),学了一招,c++对于窗体处理起来,如果用api进行编程的话都要自己手工写,就不如C#了,但是这些都是模版性的东西,一次输入,以后用即可,一劳永逸。而J君用此DialogBoxParam()似高手之出招,无章可循,学习学习。
原来对于SendMessage,心存惴惴,因为许多程序,屏蔽了外来线程传递的消息,现在自己写接受外来send的程序,嘎嘎全部都由自己来控制了,当家作一次主人。感觉甚好。此例代码用了SendMessage传递了一个参数,都是自己的东西,这个传递可以扩展到很多。而里面又用了MAKEINTRESOURCE这个宏定义来转换资源,此为C招式之根本,资源显示出很多要用到此一招。ttoi呵呵,在tchar.h中的宏.如果是unicode,它为
int _wtoi( const wchar_t *string );
否则为
int atoi( const char *string );
根据string 得到一个 int而已,(CString)
DialogBoxParam 显示了id为IDD_ERRORSHOW的资源,并且帮定了其事件处理过程Dlg_Proc,把_tWinMain的参数pszCmdLine传递其中可谓妙矣。
研究此启动过程用时不少,在此记录,备查。