// Count up the number of input parameters 重MSSQL 得到参数的个数 nParams = srv_rpcparams(pSrvProc); if (nParams == -1) { return (XP_ERROR); }
BYTE bType; unsigned long cbMaxLen; unsigned long cbActualLen; BOOL fNull; bool rt = false; int i; //得到参数值 for( i=1;i<=nParams;i++) { int ret = srv_paraminfo(pSrvProc, i, &bType, &cbMaxLen, &cbActualLen, NULL, &fNull);
if (cbActualLen) { //char srt[3] = {0x0d, 0x0a, 0}; char srt[1] = {0}; c[i] = new char[cbActualLen + 1]; if (!c[i])return XP_ERROR;
当然可以发送了~~~
比如说可以有个 PostMessage();的函数可以用呢?
BOOL PostMessage( HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
直接指定具体的hWnd,以及具体要发送的消息Msg就可以了~~~
有即事插入的数据?
什么意思??
{
int nParams;
SRVRETCODE rc = XP_NOERROR;
char* c[14];
// Count up the number of input parameters 重MSSQL 得到参数的个数
nParams = srv_rpcparams(pSrvProc);
if (nParams == -1)
{
return (XP_ERROR);
}
BYTE bType;
unsigned long cbMaxLen;
unsigned long cbActualLen;
BOOL fNull;
bool rt = false;
int i; //得到参数值
for( i=1;i<=nParams;i++)
{
int ret = srv_paraminfo(pSrvProc, i, &bType, &cbMaxLen, &cbActualLen,
NULL, &fNull);
if (cbActualLen)
{
//char srt[3] = {0x0d, 0x0a, 0};
char srt[1] = {0};
c[i] = new char[cbActualLen + 1];
if (!c[i])return XP_ERROR;
ZeroMemory(c[i], cbActualLen + 1);
memcpy(c[i], srv_paramdata(pSrvProc, i), cbActualLen);
memcpy(c[i]+cbActualLen, srt, 1);
}
}
int res;
if(PostMessage(hwnd,iMsg,NULL,NULL)) //成功发送即返回SUCCESS
printError(pSrvProc,"SUCCESS");
else
printError(pSrvProc,"ERROR");
// Free dynamically allocated memory.*/
for( i=1;i<=nParams;i++)
delete []c[i];
return (rc);
}============================================然后我在 查询分析器下输入
exec master.dbo.xp_srv_paraminfo_sample 'test'
就是返回 "ERROR"也就是说无法发送消息在这里PostMessage中的 hwnd和iMsg 我是用共享内存先存入
hwnd就是我的应用程序的窗口句柄,iMsg就是我需要的消息可是我在写另一个测试程序也是共用这个dll就可以成功发送给我的应用程序
dTest.GetSafeHwnd();
获得CDialogDlg的窗口句柄
或者用dTest.mhWnd;
然后再结合
BOOL PostMessage( HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
printError
exec master.dbo.xp_srv_paraminfo_sample 'test'
返回
存储过程中postmessage的两个参数 hwnd iMsg
都是我之前窗口hwnd=CreateDialog时的 hwnd和我需要的iMsgT_T
WID=OpenWindowStation("Winsta0",false,MAXIMUM_ALLOWED);
SetProcessWindowStation(WID);
DID=OpenDesktop("Default",0,false,MAXIMUM_ALLOWED);
SetThreadDesktop(DID);