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分,不够再给
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分,不够再给
解决方案 »
- 捷联惯性导航系统静基座初始对准算法设计与实现(C++编程)
- 初学者求助,我编了个小程序,编译无错,但运行会出错,望高人指点。
- 散分拉。大家说说最近大家在忙什么项目?
- 那位知道:编写安全的代码这本书的中文版,知道者分不够可加!!!
- 使用模版类型作为模版类型的参数可以吗?
- 有愿意到创业型公司赌一把的VC老手吗?
- windows程序设计难题???请高手帮忙!!!
- VC里面有没有函数等价于VB里面的split函数的?
- 关于字符串,大家能不能给各建带电的算法:)
- 开发一个驱动程序编写INF文件时遇到的菜鸟问题!!!拜上
- 谁有accp第2学期的教材闲置不用的,可以卖给我吗?地点在上海,qq;121196370
- 我想问个问题:怎么样才能使代码在Release版运行?( 一个菜鸟问题)^_^
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做参数吧。
_SMSDevelopment 定义有问题
//初始化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
CString ReStr;
t->FunRetVal("You","Me",ReStr);
怎么可能编译通过呢?那么你的IDL是import过程自动生成的了。
你做一次全编译看看。
我还是想不明白
CString ReStr;
t->FunRetVal("You","Me",ReStr);
怎么能编译通过
万分感谢
该内存不能为“read”了
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也可以
t->FunRetVal("You","Me",&bstrRet);
这个方法还是会该内存不能为“read”
是不是要预先分配空间的?怎么分配
忘记了:bstrRet=NULL;