eTerm组件
功能:与航信通信,将用户的命令发送到航信,接收航信返回的数据。程序一:
名称:eTermShell
功能:接收主进程传送来的WM_COPYDATA消息,将传送来的数据中的命令,使用eTerm组件发送到航信,
接收航信返回的数据(还是使用eTerm),使用SendMessage发送WM_COPYDATA消息到主进程,
将航信返回的数据传送到其他进程。程序二:
名称:eTermSrVr
功能:接收客户端的Socket连接,将客户端的eTerm命令通过WM_COPYDATA发送到子进程,接收子进程传回的数据(还是通过接收WM_COPYDATA),传回客户端(通过Socket)。
启动过程:程序启动的时候会启动几个子进程(eTermShell).问题:启动eTermSrVr, 再启动一个客户端,客户端发送几个eTerm命令(比如,查询航班的命令),这时候,打开一个文件夹(比如打开“我的文档”,或者什么其他的文件夹),eTermSrVr马上宕掉。
错误不确定,违规访问,0x0000005. Privileged Instruction ......打开IE也会使程序宕掉。
打开其他程序没问题,比如打开Word notepad什么的,没关系。
没有发送eTerm命令也没关系,打开文件夹,程序正常运行。当打开一个文件夹会发生什么?打开一个文件夹的时候,他会向其他进程发送什么消息吗?
怎么会违规访问呢?

解决方案 »

  1.   

    我想监视启动IE的时候, 他都干了什么? 都发送出了那些消息。我认为启动文件夹与启动IE是一样的。
      

  2.   

    还不能调试,是User32.dll 的问题,我没有源代码。
      

  3.   

    通过消息 WM_COPYDATA, 是很危险的,受到别的程序的干扰很大的。
    为什么不直接使用 Socket 进行进程之间的通讯呢?
      

  4.   

    呵呵,没想到在这里碰到航信的同行了:)的确用COPYDATA确实不容易做好你可以让eTermSrVr用Debug方式运行嘛?这样在崩溃的时候可以看到到底错在 你的程序 的哪里spy++好像不能监视启动时的消息,不过你可以用spy++监视一下你的程序收到什么消息没最后,耦合较松的进程直接通讯最好还是socket,标准方法,问题也少
      

  5.   

    eTermSrVr是用Debug方式运行,但是崩溃的时候是停在user32.dll中, 不是停在我的代码中,要是停在我的代码中就好了。
    我怀疑是在调用WIN32 API的时候,我没有将API函数放在 catch 块中,抓异常。
      

  6.   

    使用Socket与使用 WM_COPYDATA 哪个速度更快一点?
    这个程序要求速度。
      

  7.   

    1.可以看call stack 窗口,调用堆栈中或许可以看到是你程序的哪里出错了2. 个人感觉两种方式本身差别不大,有差异可能就在你的数据结构设计和配套算法上面吧。
      

  8.   

    call stack 窗口:
    0102ff18()
    890476ff()
      

  9.   

    0102FF00   int         3
    0102FF01   int         3
        0102FF02   int         3
        0102FF03   int         3
        0102FF04   loope       0102FF08
        0102FF06   add         al,0
    ==> 0102FF08   hlt
        0102FF09   add         al,byte ptr [eax+eax]
        0102FF0C   rol         al,1
        0102FF0E   add         byte ptr [eax],al
        0102FF10   add         byte ptr [eax],alhlt 是停机指令吧! 怎么会有停机指令呢? 难道是病毒?
      

  10.   

    用spyxx看了, 消息是 0xC0D6   Registered:"ShellFileOpen" 
    不明白他为什么会使一个程序死掉呢?
    我用的是WinXP 把3721删除了,还是没用。
      

  11.   

    我认为是你的组件的问题,可能是只要有"相关"的进程启动就会自动加载你的组件(就像QQHOOK.DLL),我想你可以从这个方向检查一下.
      

  12.   

    CALL BACK 窗口:
    USER32! 77d19100()
    CWinThread::PumpMessage() line 814 + 19 bytes
    CWinThread::Run() line 480 + 11 bytes
    CWinApp::Run() line 400
    AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00141f32, int 1) line 49 + 11 bytes
    WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00141f32, int 1) line 30
    WinMainCRTStartup() line 330 + 54 bytes
    KERNEL32! 7c816d4f()
      

  13.   

    停在了这行:
    if (!::GetMessage(&m_msgCur, NULL, NULL, NULL))GetMessage 的问题