一无所获,寸步难行
作为一个文本编辑器,一个IDE,不能通过命令行参数打开一个文件,是很说不过去的,于是我就想加这个功能,不料却意外地困难!
首先考虑当前没有已经运行的本程序的进程,通过命令行参数指定一个文件后,最wxApp::OnInit的最后返回前,主窗口已经正常创建显示后,可以将文件路径传递给主窗口,让主窗口打开这个文件。照理说,这应该是一个很平常很普通很正规的流程吧,结果不知道为什么,打开文件这个操作会让程序崩溃。
然后考虑当前已经有运行的本程序的进程了,这时如果再通过命令行参数指定一个文件,启动新进程,就需要让新进程通过IPC向老进程发送通知,让老进程来打开这个文件,而完成通知工作后新进程就可以退出了。这也是一个很平常很普通很正规的流程吧,于是我查阅了wxWidgets的关于IPC的文档和sample代码,感觉还是很简单的。在Windows平台上有两种选择,分别是基于DDE的实现和基于Socket的实现,可以用相同的代码,最终通过预定义宏来开关选择,可是最终仍然是问题重重。使用基于Socket的实现,进程在第一次启动时,Windows会弹出消息框询问是否允许该程序在本地打开一个网络端口进行监听,这就已经有点小题大做了。然后当新进程给老进程发送通知时,老进程不是没反应,貌似根本没收到通知,就是崩溃!如果切换成基于DDE的实现,倒是老进程能收到通知,但有个很奇怪的现象是从收到通知开始的那个wxDDEConnection::OnExecute函数开始往下走,wxChar*或wxString不能正确转换为const char*(因为我是使用Unicode编译项目,而字符串要以const char *传递给内嵌的Lua解释器),反正就是无论用wxString::mb_str(),还是直接的wxConvLocal::cWC2MB()都不能正确返回转换后的const char*。试了一下C runtime中的wcstomb函数,倒是能正常转换。但在Lua回调宿主程序导出的函数时,该函数将wxString转换为std::string作为返回值传递给Lua,无论用哪种转换方法,结果也会崩溃!
到此为止,所有尝试均告失败,加入命令行参数打开文件功能仍然没有实现,郁闷!