HRESULT hresult;
CLSID clsid;
CoInitialize(NULL);
//初始化COM接口
hresult=CLSIDFromProgID(OLESTR("MyVBDLL.TextDll"), &clsid);
//得到组件的CLSID
_SMSDevelopment *t;
//这就是我们在MyVBDLL.DLL中定义的类
hresult=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(_TextDll),(LPVOID *) &t);
if(FAILED(hresult))
{
    AfxMessageBox("初始化服务组件失败");
    return;
}//如果不取返回值的时候(这样可以成功登录),即能够成功运行程序
t->FunLogin("jim","12345");
//假设是对数据库添加数据,能够成功添加
t->FunAdd("testVC");1.问题***************************************************************
//但是我的函数都是有返回值的,如果用下面的方法取返回值,能够编译通过,还能运行,但是一运行后就会出现弹出 “终止”,“重试”,“忽略”的那个错误信息提示
short retval;
retval = t->FunLogin("jim","12345");
retval = t->FunAdd("testVC");
//运行后同样是能够向数据库添加数据,就是运行后会弹出错误信息
//我怀疑是返回值的时候出错2.问题**************************************************************
在vb中的程序(写在ActiveX Dll中)
Public Function FunRetVal(Byval Str1 As String, ByVal Str2 As String, ByRef StrRetVal As String) As Integer
    StrRetVal = Str1 & " And " & Str2
End Function
就这样简单的程序在vc里面调用就是出错,我觉得也是返回值出错
CString ReStr;
t->FunRetVal("You","Me",ReStr);
调用之后会出现内存不能为“read”大家帮一下我拉,好痛苦啊,答对一个给100分,不够再给

解决方案 »

  1.   

    vb中
    Public Function FunRetVal(Byval Str1 As String, ByVal Str2 As String, ByRef StrRetVal As String) As Integer
        StrRetVal = Str1 & " And " & Str2
    End Function显然在实现上要对 strRetVal进行修改,并回传给调用者,是个[in,out]类型,即在IDL中应该被声明为[in,out]BSTR*但你在vc中直接用CString ReStr;
    t->FunRetVal("You","Me",ReStr);这样是传值吧,内部不能正确修改 ReStr的值的。我真不明白怎么能编译过去?至少也得是&reStr呀。
    当然,直接用&reStr也不应该编译通过,难道你手工改了IDL?或者你修改了_SMSDevelopment 的定义?使其定义与实际的接口定义不符合?用CString 作为BSTR无论如何是不妥的。还是老老实实用BSTR做参数吧。
      

  2.   

    至于返回值,也不应该出错,我怀疑你的
    _SMSDevelopment 定义有问题
      

  3.   

    不好意思,应该是
    //初始化COM接口
    hresult=CLSIDFromProgID(OLESTR("MyVBDLL.TextDll"), &clsid);
    //得到组件的CLSID
    _TextDll *t;
    其他地方只在stdafx.h中加了
    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
    #import "MyVBDLL.dll"
    using namespace MyVBDLL;
    #endif // !defined(AFX_STDAFX_H__6874AAC2_9ADC_42D0_AC2B_63F8336D59C3__INCLUDED_)没有什么IDL
      

  4.   

    既然你用import,那么
    CString ReStr;
    t->FunRetVal("You","Me",ReStr);
    怎么可能编译通过呢?那么你的IDL是import过程自动生成的了。
    你做一次全编译看看。
    我还是想不明白
    CString ReStr;
    t->FunRetVal("You","Me",ReStr);
    怎么能编译通过
      

  5.   

    是编译不过,那么怎么用BSTR来接收呢?
    万分感谢
      

  6.   

    改了用BSTR后现在出现
    该内存不能为“read”了
      

  7.   

    对你的vbdll,import生成的IDL,声明应该是这样的
    short FunRetVal( [in] BSTR Str1, [in] BSTR Str2, [in, out] BSTR* StrRetVal);那么直接用CString调用 肯定会有问题的
    试验如下代码BSTR bstrRet;
    t->FunRetVal("You","Me",&bstrRet);//如果你要用CString,则可以直接用其重载功能,把BSTR赋值给CString 
    CString strRet;
    strRet= bstrRet;//或者,如果你不用CString ,而使用 _bstr_t也可以
      

  8.   

    BSTR bstrRet;
    t->FunRetVal("You","Me",&bstrRet);
    这个方法还是会该内存不能为“read”
    是不是要预先分配空间的?怎么分配
      

  9.   

    不用分配的。
    忘记了:bstrRet=NULL;
      

  10.   

    it's very kind of you to help me:)