发送短信,发送邮件是一个外部程序
现在要做的是当将数据insert into到Oracle数据库中时设定了sendtime,那么怎么实现到sendtime来调用上面的外部程序?我的想法是insert into的时候建立job,job中调用一个外部dll(用C++写的),然后这个dll向上面的外部程序发送消息,现在的问题是job中调用dll怎么传参?
哪位大哥碰到过类似的问题,或者有什么更好的办法来解决我的问题,请指教。
谢谢。
现在要做的是当将数据insert into到Oracle数据库中时设定了sendtime,那么怎么实现到sendtime来调用上面的外部程序?我的想法是insert into的时候建立job,job中调用一个外部dll(用C++写的),然后这个dll向上面的外部程序发送消息,现在的问题是job中调用dll怎么传参?
哪位大哥碰到过类似的问题,或者有什么更好的办法来解决我的问题,请指教。
谢谢。
上面的dll传参问题已经解决,新的问题又出来了:
在dll中用findWindowEx查找接受这个消息的窗体,始终找不到。
{
//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;
}
桌面上存在"spirit"这个类吗?不是的话如何从桌面窗体中查找到他呢?
是hVscpDataBase = FindWindowEx(NULL, NULL, "spirit", NULL);这句找不到窗体
相同的代码,我写到另外的一个exe中就可以找到spirit这个窗体
百思不得其解???
大侠知道怎么做?
现在我已经做到可以切换到WinSta0的Defualt,但是当我用EnumWindow枚举所有的窗体,然后用GetWindowText获取title,发现
GetWindowText的返回值好多都是0,也就不能获得title。
但是我用另外的exe,切换到WinSta0的Defualt,用EnumWindow枚举所有的窗体,然后用GetWindowText获取title,就可以获得title.这是“为什么昵!”……为什么呢!
在Oracle中使用COM,参考http://soft.zdnet.com.cn/software_zone/2007/0926/524707.shtml
或者把数据写到一个表(瘦表),然后C++线程扫描瘦表 ,发送完了之后删除瘦表,做一个删除触发器,把删除的数据存到另一个表(胖表).
不知这样能不能合楼主的需求.
还是建议用SMTP包来处理邮件。
但是我的需求有点差别,所以才想这样解决。最后都没有通过dll向另外的窗体发送消息。
按照biggates的建议,换作oracle直接操作COM实现了。结贴。