发送短信,发送邮件是一个外部程序
现在要做的是当将数据insert into到Oracle数据库中时设定了sendtime,那么怎么实现到sendtime来调用上面的外部程序?我的想法是insert into的时候建立job,job中调用一个外部dll(用C++写的),然后这个dll向上面的外部程序发送消息,现在的问题是job中调用dll怎么传参?
哪位大哥碰到过类似的问题,或者有什么更好的办法来解决我的问题,请指教。
谢谢。

解决方案 »

  1.   

    可以的。明确一下思路,job启用过程,过程里调用dll。具体的方法可以baidu一下,存储过程嗲用dll,好多的。
      

  2.   

    @jdsnhan
    上面的dll传参问题已经解决,新的问题又出来了:
    在dll中用findWindowEx查找接受这个消息的窗体,始终找不到。
      

  3.   

    在线等,谁能告诉我下面的代码为什么找不到窗体呢?下面的代码在dll中short SendSmsMessage2DB(BSTR mobile_no, BSTR text)
    {
        //AwokeMission awoke;
        SmsMission sms;
        memset(&sms, 0, sizeof(SmsMission));
        //relVSCPDataBase0,-1
        int rel = -1;
        int num = 0;    strcpy(sms.mobile_no, _com_util::ConvertBSTRToString(mobile_no));
        strcpy(sms.text, _com_util::ConvertBSTRToString(text));
        
        //window
        DWORD dwThreadId;     //ID      
        HWINSTA hwinstaSave;   //window   station        
        HDESK hdeskSave;       //     window   stationdesktop
        HWINSTA hwinstaUser;   //window   station      
        HDESK hdeskUser;   //window   stationdesktop      
        HWND hVscpDataBase;
           
        /*window   stationdesktop*/
        hwinstaSave   =   GetProcessWindowStation();     
        dwThreadId   =   GetCurrentThreadId();
        hdeskSave   =   GetThreadDesktop(dwThreadId);
        
        char ErrorBuffer[2048] = {0};    /*WinSta0\Default*/
        hwinstaUser = OpenWindowStation( "WinSta0", FALSE, MAXIMUM_ALLOWED);  
        if(NULL == hwinstaUser)
        {
            DWORD errorCode = GetLastError();
            sprintf(ErrorBuffer, "echo %x > e:\\error.txt", errorCode);
            system(ErrorBuffer);
            return (rel = -2);
        }    SetProcessWindowStation(hwinstaUser);          
        hdeskUser = OpenDesktop( "Default",  0, FALSE, MAXIMUM_ALLOWED);          
        if(NULL == hdeskUser)
        {          
            SetProcessWindowStation(hwinstaSave);          
            CloseWindowStation(hwinstaUser);
            DWORD errorCode = GetLastError();
            sprintf(ErrorBuffer, "echo %x > e:\\error.txt", errorCode);
            system(ErrorBuffer);
            return (rel = -3);          
        }       
        SetThreadDesktop(hdeskUser);
        
        hVscpDataBase = FindWindowEx(NULL, NULL, "spirit", NULL);
        
        if (hVscpDataBase != NULL)
        {
            //
            system("echo success > e:\\error.txt");
            SendMessage(hVscpDataBase, WM_USER_SMS, (WPARAM)&sms, (LPARAM)&rel);
            num++;
            //100
            while (rel == -1 && num < 100)
            {
                SendMessage(hVscpDataBase, WM_USER_SMS, (WPARAM)&sms, (LPARAM)&rel);
                num++;
            }
        }
        else
        {
            DWORD errorCode = GetLastError();
            sprintf(ErrorBuffer, "echo failed errorcode = %x > e:\\error.txt", errorCode);
            system(ErrorBuffer);
            
        }    /**/
        SetThreadDesktop(hdeskSave);          
        SetProcessWindowStation(hwinstaSave);          
        CloseDesktop(hdeskUser);          
        CloseWindowStation(hwinstaUser);   
        return rel;
    }
      

  4.   

    哦,忘了说了,上面的代码是用C++写的,由于论坛不支持C++语法高亮,所以只能用C#了
      

  5.   

    是hVscpDataBase = FindWindowEx(NULL, NULL, "spirit", NULL);这句找不到窗口吗?
    桌面上存在"spirit"这个类吗?不是的话如何从桌面窗体中查找到他呢?
      

  6.   

    @doer_ljy
    是hVscpDataBase   =   FindWindowEx(NULL,   NULL,   "spirit",   NULL);这句找不到窗体
    相同的代码,我写到另外的一个exe中就可以找到spirit这个窗体
    百思不得其解???
      

  7.   

    dll 通过什么程序调用的?可以调试么?
      

  8.   

    在oracle的slq*plus调用该dll,暂时不知道怎么调试。
    大侠知道怎么做?
      

  9.   

    怎么没人理呢?
    现在我已经做到可以切换到WinSta0的Defualt,但是当我用EnumWindow枚举所有的窗体,然后用GetWindowText获取title,发现
    GetWindowText的返回值好多都是0,也就不能获得title。
    但是我用另外的exe,切换到WinSta0的Defualt,用EnumWindow枚举所有的窗体,然后用GetWindowText获取title,就可以获得title.这是“为什么昵!”……为什么呢!
      

  10.   

    换个思路啦   一定要通过dll 么?能不能通过别的技术?COM之类的
    在Oracle中使用COM,参考http://soft.zdnet.com.cn/software_zone/2007/0926/524707.shtml
      

  11.   

    为何不反过来写呢, oracle只管写数据, C++写个线程扫描表. 扫描到senttime>当前时间就把数据拿出来发送,然后更新发送状态.
    或者把数据写到一个表(瘦表),然后C++线程扫描瘦表 ,发送完了之后删除瘦表,做一个删除触发器,把删除的数据存到另一个表(胖表).
    不知这样能不能合楼主的需求.
      

  12.   

    oracle本身好像就有发送邮件的功能,不知道是不是可以写个触发器然后直接让Oracle发邮件就可以了
      

  13.   

    Oracle提供了SMTP包 用来处理发送邮件,不过我没有用过,楼主可以研究一下。
      

  14.   

    findWindowEx在exe中好用,你使用的是dll,肯定不好用。
    还是建议用SMTP包来处理邮件。
      

  15.   

    在Sql Server中可以创建外部存储过程来调用,在Oracle应该也可以吧,不过正如楼上所说,建议使用Oracle的package来发送邮件.
      

  16.   

    好久没来看了,其实要是定时发送邮件就没有问题,这个我可以解决。
    但是我的需求有点差别,所以才想这样解决。最后都没有通过dll向另外的窗体发送消息。
    按照biggates的建议,换作oracle直接操作COM实现了。结贴。