void CallBackProc(BSTR BS_flag,BSTR BS_svalue1,BSTR BS_svalue2,BSTR BS_svalue3,BSTR BS_svalue4,BSTR BS_svalue5,
BSTR BS_svalue6,BSTR BS_svalue7 ,BSTR BS_svalue8)
{
// TODO: Add your control notification handler code here
int flag = atoi(_com_util::ConvertBSTRToString(BS_flag));
char *svalue1 = _com_util::ConvertBSTRToString(BS_svalue1);
char *svalue2 = _com_util::ConvertBSTRToString(BS_svalue2);
char *svalue3 = _com_util::ConvertBSTRToString(BS_svalue3);
char *svalue4 = _com_util::ConvertBSTRToString(BS_svalue4);
char *svalue5 = _com_util::ConvertBSTRToString(BS_svalue5);
char *svalue6 = _com_util::ConvertBSTRToString(BS_svalue6);
char *svalue7 = _com_util::ConvertBSTRToString(BS_svalue7);
char *svalue8 = _com_util::ConvertBSTRToString(BS_svalue8); CString msgstr;
CString msgtemp;
recvNum ++;
if(flag == 4){
msgtemp.Format("%6d [业务响应包] SequenceID:%s MessID:%s STATUS:%s", recvNum, svalue1, svalue2, svalue3);
}
else if(flag == 5){
msgtemp.Format("%6d [上行短信包] SequenceID:%s 发送号码:%s 接收号码:%s 接收时间:%s 短信内容:%s",
recvNum, svalue1, svalue2, svalue3, svalue4, svalue5);
}
else if(flag == 7){
msgtemp.Format("%6d [短信回执包] SequenceID:%s MessID:%s 发送号码:%s 接收号码:%s 提交时间:%s 下发时间:%s 短信状态:%s 错误代码:%s",
recvNum, svalue1, svalue2, svalue3, svalue4, svalue5, svalue6, svalue7, svalue8);
}
MessageBoxA(NULL,msgtemp,"CallBackProc",MB_OK);
msgstr += msgtemp;
msgstr += '\n';
theApp.m_pMainWnd->GetDlgItem(IDC_SHOWMSG)->SetWindowText(msgstr);
}void Startthread(CComPtr<IFullTunnelServiceControl>& spTmp)
{_variant_t callback;
VariantInit(&callback);
callback.vt = VT_NULL;
callback.pvRecord= (PVOID)CallBackProc;
cout<<"use com begin.........."<<endl;
CComBSTR str;
spTmp->StartRecv_User(callback);
cout<<"use com end............"<<endl;
}void CSendTestDlg::OnStartthread()
{
_variant_t callback;
VariantInit(&callback);
callback.vt = VT_NULL; //组件用vt标识 是页面调用 还是 C++调用
callback.pvRecord= (PVOID)CallBackProc;
hr = spTmp->StartRecv_User(callback);
switch(hr)
{
case 0: //其他返回值参见COM调用错误编号 三.调用StartRecv_User
MessageBox("创建接收线程成功","OnStartthread",MB_OK);
break;
case 1:
MessageBox("创建接收线程失败","OnStartthread",MB_OK);
break;
default:
;
}
}
BSTR BS_svalue6,BSTR BS_svalue7 ,BSTR BS_svalue8)
{
// TODO: Add your control notification handler code here
int flag = atoi(_com_util::ConvertBSTRToString(BS_flag));
char *svalue1 = _com_util::ConvertBSTRToString(BS_svalue1);
char *svalue2 = _com_util::ConvertBSTRToString(BS_svalue2);
char *svalue3 = _com_util::ConvertBSTRToString(BS_svalue3);
char *svalue4 = _com_util::ConvertBSTRToString(BS_svalue4);
char *svalue5 = _com_util::ConvertBSTRToString(BS_svalue5);
char *svalue6 = _com_util::ConvertBSTRToString(BS_svalue6);
char *svalue7 = _com_util::ConvertBSTRToString(BS_svalue7);
char *svalue8 = _com_util::ConvertBSTRToString(BS_svalue8); CString msgstr;
CString msgtemp;
recvNum ++;
if(flag == 4){
msgtemp.Format("%6d [业务响应包] SequenceID:%s MessID:%s STATUS:%s", recvNum, svalue1, svalue2, svalue3);
}
else if(flag == 5){
msgtemp.Format("%6d [上行短信包] SequenceID:%s 发送号码:%s 接收号码:%s 接收时间:%s 短信内容:%s",
recvNum, svalue1, svalue2, svalue3, svalue4, svalue5);
}
else if(flag == 7){
msgtemp.Format("%6d [短信回执包] SequenceID:%s MessID:%s 发送号码:%s 接收号码:%s 提交时间:%s 下发时间:%s 短信状态:%s 错误代码:%s",
recvNum, svalue1, svalue2, svalue3, svalue4, svalue5, svalue6, svalue7, svalue8);
}
MessageBoxA(NULL,msgtemp,"CallBackProc",MB_OK);
msgstr += msgtemp;
msgstr += '\n';
theApp.m_pMainWnd->GetDlgItem(IDC_SHOWMSG)->SetWindowText(msgstr);
}void Startthread(CComPtr<IFullTunnelServiceControl>& spTmp)
{_variant_t callback;
VariantInit(&callback);
callback.vt = VT_NULL;
callback.pvRecord= (PVOID)CallBackProc;
cout<<"use com begin.........."<<endl;
CComBSTR str;
spTmp->StartRecv_User(callback);
cout<<"use com end............"<<endl;
}void CSendTestDlg::OnStartthread()
{
_variant_t callback;
VariantInit(&callback);
callback.vt = VT_NULL; //组件用vt标识 是页面调用 还是 C++调用
callback.pvRecord= (PVOID)CallBackProc;
hr = spTmp->StartRecv_User(callback);
switch(hr)
{
case 0: //其他返回值参见COM调用错误编号 三.调用StartRecv_User
MessageBox("创建接收线程成功","OnStartthread",MB_OK);
break;
case 1:
MessageBox("创建接收线程失败","OnStartthread",MB_OK);
break;
default:
;
}
}
2. 当认证通过后即可调用StartRecv_User(VARIANT callback)函数;此函数用户创建接收线程(用于接收业务响应包,回执包,上行短信包). (参见SendTest程序中CSendTestDlg::OnStartthread()方法)此处参数callback.pvRecord特殊。参数必须为void CallBackProc(BSTR BS_flag,BSTR BS_svalue1,BSTR BS_svalue2,BSTR BS_svalue3,BSTR BS_svalue4,BSTR BS_svalue5, BSTR BS_svalue6,BSTR BS_svalue7 ,BSTR BS_svalue8)从而用作回调函数。用户在CallBackProc中根据flag的值相应的取不同的字段从而可以分别得到业务响应包,回执包,上行短信包。当flag == 4时,此时为业务响应包。当flag == 5时,此时为上行短信包。当flag == 7时 此时为回执包
void Startthread(CComPtr<IFullTunnelServiceControl>& spTmp)
{_variant_t callback;
VariantInit(&callback);
callback.vt = VT_NULL;
callback.pvRecord= (PVOID)CallBackProc;
cout<<"use com begin.........."<<endl;
CComBSTR str;
spTmp->StartRecv_User(callback);
cout<<"use com end............"<<endl;
}
只要这段就可以了
callback让我有些看不懂,看上去是个类。
这个用到了C++的模板,delphi中没有的,而我对delphi的COM+编程不熟。
实在不行,你用VC(因为我见到了VC的CString类)先将此段程序封装成DLL,给delphi调用