我在SQL SERVER 2005上使用命令:exec master..xp_cmdshell 'C:\Notify.exe',但执行中SQL SERVER发出WIN32异常的通知。Notify.exe是一个用VC写的win32控制台程序,在人工调用执行正常,里面使用到Postmessage函数,主要代码如下:void main(int argc,char * argv[])
{
    CWnd *pWnd = CWnd::FindWindow(NULL, "目标程序"); 
    pWnd->PostMessage(WM_IDMSG, 0, 0); //传输消息至目标程序,WM_IDMSG是自己定义的消息
     return;
}我将Postmessage那句删除就没有出现上述问题,请问各位知道是什么原因或者有没其他方法代替。这个东西很急,麻烦大家帮忙了。谢谢啦~~~

解决方案 »

  1.   

    发觉原来是在数据库调用程序,FindWindow不能找到"目标程序标题名",就是这个引起错误,但依然不知道怎么解决,继续等待...
      

  2.   

    没太看明白你的意思。不过猜测出你的问题大概是什么了。vc不熟,不过你的findwindow应该还是调用或者说封装了findwindow或findwindowEx的win32api吧.xp_cmdshell所调用的程序执行后只有一个进程,没有窗口的,所以是找不到的。  所以你应该是在任务进程中查找进程,而不是findwindow.个人看法,仅供参考。
      

  3.   

    我觉得楼主应该从程序入手,如果你的程序在dos下面运行没有问题,那么你用sql2005的命令exec master..xp_cmdshell也应该是没有问题的
      

  4.   

    在PostMessage前,应先判断pWnd是否有效(是否已取得目标窗体)
      

  5.   

    ljluck7687说得是对的,是pWnd出现了问题。查了些资料,在SQLSERVER中,如果你的服务无法与桌面交互,findwindow会无法找到相应程序。以下方法可以开启桌面交互,不过一般不建议这样做,会有点安全性问题的。
    http://topic.csdn.net/t/20040423/14/3000755.html
    但我按照上面方法弄了,依然不行,不知是否有其他问题,继续等待...
      

  6.   

    你更改sqlserver 服务的启动账户方式没有
      

  7.   

    在3楼早就说过了你试下  xp_cmdshell 'notepad.exe'看看任务管理器进程里有notepad却没有notepad窗口, 没有窗口句柄,又怎么能用findwindow得到呢?再重复说一次,xp_cmdshell所调用的窗口程序不会产生窗口。
      

  8.   

    to fcuandy
    你的理解有点问题,xp_cmdshell所调用的窗口程序不会产生窗口,但现在findwindow不是找不到自己的窗口,而是找不到另一个已启动的窗口。但导致这个问题的原因我还没找到,即使启动了SQLSERVER服务与桌面交互。
    But...thank you all the same! ^-^
      

  9.   

    楼主可以看一下这个贴子。http://topic.csdn.net/t/20060726/04/4904795.html服务类程序及xp_cmdshell产生的进程都与桌面应用程序不在同一桌面,所以是无法获得窗口句柄的。还是建议你试一下取进程,而不是取窗口。可以试下枚举进程。
      

  10.   

    嗯,fcuandy的建议很不错。按照这个方法做了修改就可以了,感谢fcuandy同各位大虾,结帖拉~~~