挖井

类库大魔王的挖井日记

挖一口属于自己的井


一无所获,寸步难行

  作为一个文本编辑器,一个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,无论用哪种转换方法,结果也会崩溃!
  到此为止,所有尝试均告失败,加入命令行参数打开文件功能仍然没有实现,郁闷!

本文地址:

https://minidump.info/blog/2010/10/e4-b8-80-e6-97-a0-e6-89-80-e8-8e-b7-ef-bc-8c-e5-af-b8-e6-ad-a5-e9-9a-be-e8-a1-8c/

上一篇

Twitter hosts IP全挂了

  昨晚突然发现twitter的hosts ip不能用了,在just-ping.com里找了一遍api.twitter.com的ip,挨个儿ping了一遍,没有一个能ping通的。真是太杯具了,如果用Mac OSX,倒是没什么影响,反正我都是连上SSH后进行全局代理的,Echofon for ...…

SNS 全文阅读
下一篇

实现命令行打开文件

  之前我说过,作为一个文本编辑器,一个IDE,不能通过命令行参数打开一个文件,是很说不过去的。前面试图加入这个功能,结果遇到了些问题,经过昨天和今天的奋战,终于搞定了。  其实就是发现用wxWidgets的IPC机制怎么都不能正常运行,于是最后我想到了直接用Boost的InterProces...…

CodingStudio 全文阅读