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:
;
}
}

解决方案 »

  1.   

    是一段短信平台的调用,说明如下:
    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时 此时为回执包
      

  2.   

    大侠们出个手啊
    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;
    }
    只要这段就可以了
      

  3.   

    我觉得就是一个回掉函数的调用。没什么阿?楼主在那里遇到问题了。
    callback让我有些看不懂,看上去是个类。
      

  4.   

    void Startthread(CComPtr <IFullTunnelServiceControl>& spTmp) 
    这个用到了C++的模板,delphi中没有的,而我对delphi的COM+编程不熟。
    实在不行,你用VC(因为我见到了VC的CString类)先将此段程序封装成DLL,给delphi调用
      

  5.   

    我也在关注这个问题,要用C#调用这个com组件,就是回调函数的地方有问题,楼主你解决了没。