社区
VB
帖子详情
vb.net调用vc6.0写的COM
liuka
2008-07-16 11:49:41
如题
COM中要返回一个VARIANT类型数据
我在 VC6.0 VB中都可以正常使用
但在vb.net下就提示
未处理的“System.ArgumentException”类型的异常出现在 VB.net.exe 中。
其他信息: 指定的记录无法映射到托管值类。
在C#下也是这样的错误
请问如何解决
...全文
198
8
打赏
收藏
vb.net调用vc6.0写的COM
如题 COM中要返回一个VARIANT类型数据 我在 VC6.0 VB中都可以正常使用 但在vb.net下就提示 未处理的“System.ArgumentException”类型的异常出现在 VB.net.exe 中。 其他信息: 指定的记录无法映射到托管值类。 在C#下也是这样的错误 请问如何解决
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
liuka
2008-07-16
打赏
举报
回复
[Quote=引用 5 楼 xuda_peter_123 的回复:]
问题是你传入的VB.NET数据类型和COM的数据类型不能映射,
你传入的是Object类型, 而Object类型根本没有 vt, parray这样的属性,
所以就出现了问题.
注意VB.NET和COM组件进行交流时仅仅限于简单数据类型,比如String, int等,
自定义数据类型一般是不可以的.
[/Quote]
我换成SAFEARRAY
就可以了
liuka
2008-07-16
打赏
举报
回复
[Quote=引用 5 楼 xuda_peter_123 的回复:]
问题是你传入的VB.NET数据类型和COM的数据类型不能映射,
你传入的是Object类型, 而Object类型根本没有 vt, parray这样的属性,
所以就出现了问题.
注意VB.NET和COM组件进行交流时仅仅限于简单数据类型,比如String, int等,
自定义数据类型一般是不可以的.
[/Quote]
当我传一个结构体的时候可以在.net中使用 啊
现在就是传一个结构体数组的时候在.net中提示异常
我的结构体为
[uuid(8C58263A-838E-4bd0-889F-05A98B2288BB)]
typedef struct Room_Infor //房间信息
{
BSTR ID; //ID
BSTR name; //name
BSTR location;//区
BSTR status; //状态
} Room_Infor;
psa=SafeArrayCreateVectorEx(VT_RECORD,0,long(i_count),(void*)pRecordInfo);
当我把类型更换为VT_BSTR / VT_VARIANT 等都 又提示什么非托管到托管错误
我在网上找的好象只能用VT_RECORD表明自定义类型
珍惜生命远离CPP
2008-07-16
打赏
举报
回复
应该是对传递的VT_RECORD类型封装的有问题。
我觉得应该只使用原始类型。
LONGLONG llval; // VT_I8.
LONG lVal; // VT_I4.
BYTE bVal; // VT_UI1.
SHORT iVal; // VT_I2.
FLOAT fltVal; // VT_R4.
DOUBLE dblVal; // VT_R8.
VARIANT_BOOL boolVal; // VT_BOOL.
_VARIANT_BOOL bool;
SCODE scode; // VT_ERROR.
CY cyVal; // VT_CY.
DATE date; // VT_DATE.
BSTR bstrVal; // VT_BSTR.
IUnknown * punkVal; // VT_UNKNOWN.
IDispatch * pdispVal; // VT_DISPATCH.
xuda_peter_123
2008-07-16
打赏
举报
回复
问题是你传入的VB.NET数据类型和COM的数据类型不能映射,
你传入的是Object类型, 而Object类型根本没有 vt, parray这样的属性,
所以就出现了问题.
注意VB.NET和COM组件进行交流时仅仅限于简单数据类型,比如String, int等,
自定义数据类型一般是不可以的.
liuka
2008-07-16
打赏
举报
回复
如下
[id(3), helpstring("method GetRoomList")] HRESULT GetRoomList([out]VARIANT *pRoomList,[out,retval]long *iCount);
STDMETHODIMP CCOM_DB::GetRoomList(VARIANT *pRoomList, long *iCount)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
_RecordsetPtr pRs =NULL;
pRs.CreateInstance(__uuidof(Recordset));
CString m_ID,m_name, m_location, m_status;
if(pConn == NULL)
{
AfxMessageBox("连接已经失效");
return S_FALSE;
}
else
{
try
{
pRs->CursorLocation = adUseClient;
pRs->PutRefActiveConnection(pConn);
pRs->Open((_bstr_t)"select * from DB_Room",vtMissing,adOpenStatic,adLockBatchOptimistic,-1);
pRs->PutRefActiveConnection(NULL);
}
catch(_com_error &e1)
{
CString str;
str.Format("打开记录集失败!!!-%s",e1.ErrorMessage());
AfxMessageBox(str);
for(long i =0 ; i < pConn->Errors->GetCount(); i++)
{
AfxMessageBox(pConn->Errors->GetItem(_variant_t(i))->Description);
}
return S_FALSE;
}
*iCount = pRs->GetRecordCount();
long i_count = 0;
i_count = pRs->GetRecordCount();
Room_Infor *RoomStruct = NULL;
VariantInit(pRoomList);
SAFEARRAY *psa = NULL; //安全数组的定义
// SAFEARRAYBOUND sad[1];
// sad[0].cElements = i_count;
// sad[0].lLbound = 0;
// psa = ::SafeArrayCreate(VT_VARIANT,1,sad);
IRecordInfo* pRecordInfo=NULL;
// {8C58263A-838E-4bd0-889F-05A98B2288BB}
static const GUID IID_STRUCT_ROOM =
{ 0x8c58263a, 0x838e, 0x4bd0, { 0x88, 0x9f, 0x5, 0xa9, 0x8b, 0x22, 0x88, 0xbb } };
HRESULT hr=::GetRecordInfoFromGuids(LIBID_DBCOMLib,1,0,GetUserDefaultLCID(),IID_STRUCT_ROOM,&pRecordInfo);
if(FAILED(hr))
return E_FAIL;
psa=SafeArrayCreateVectorEx(VT_RECORD,0,long(i_count),(void*)pRecordInfo);
pRoomList->vt = VT_ARRAY|VT_RECORD;
pRoomList->parray = psa;
SafeArrayAccessData(psa, (void**)&RoomStruct);//获取SafeArray的数据的指针
for(long m=0; m < i_count; m++)
{
m_ID = GetAsString(pRs,"Rid");
m_name = GetAsString(pRs, "name");
m_location = GetAsString(pRs,"location");
m_status = GetAsString(pRs, "status");
RoomStruct[m].ID = m_ID.AllocSysString();
RoomStruct[m].name = m_name.AllocSysString();
RoomStruct[m].location = m_location.AllocSysString();
RoomStruct[m].status = m_status.AllocSysString();
pRs->MoveNext();
}
SafeArrayUnaccessData(psa);//add!
pRs->AddRef();
return S_OK;
}
}
珍惜生命远离CPP
2008-07-16
打赏
举报
回复
COM 是怎么写的?
liuka
2008-07-16
打赏
举报
回复
Dim var As Object
Dim abc() As DBCOMLib.Room_Infor
Dim Count As Long
Count = ob.GetRoomList(var) -->提示 指定的记录无法映射到托管值类。
abc = var
珍惜生命远离CPP
2008-07-16
打赏
举报
回复
你怎么返回的?
VC++6.0
调用
VB.net
VB.ne程序作成 实装VbClass.vb类 Imports System.Runtime.InteropServices <ClassInterface(ClassInterfaceType.None)> Public Class VbClass Public Function vb_function(ByRef strIn1 As String, ByRef str...
在VC.NET中
调用
VB.NET
或C#生成的DLL类库
在C++中,想要
调用
其它语言编
写
的DLL动态库,原先通常的做法是基于
COM
组件(
Com
ponent Object Module)技术编译ActiveX DLL动态链接库,注册(Regsvr32)之后即可在C++中
调用
。到了DOTNET环境中,上述方法依然有效,因为VC.NET依然支持非托管DLL文件,但是
VB.NET
/C#编
写
的DLL类库属于托管代码,就不能用非托管方式
调用
了。当然,
VB.NET
或C
VB.net
与VB6
调用
Websocket功能的方法--Websocket For VB
如何在
VB.net
与VB6 实现Websocket的功能方法,介绍了一个现成的免费组件的使用,该组件简单易用,性能优越。该组件功能全面,支持TLS,全面支持WS与WSS协议
VC++
调用
VB.NET
缩
写
的
COM
现在
COM
组件的使用越来越广泛,在各个程序中
调用
COM
组件我想大家都遇到过,这篇文章就是关于
COM
组件的编
写
和
调用
的,主要包含了使用
VC6.0
编
写
和
调用
COM
组件,VS2005中使用VB编
写
和
调用
COM
组件,以及在
VC6.0
和VS2005之间互相
调用
COM
组件。操作规程与上一篇C
matlab下做
com
组件
邓科峰 dkf03@mails.tsinghua.edu.cn matlab的
com
builder系列-matlab下做
com
组件
com
builder是matlab6.5才有的,也是mathworks公司推荐使用于混合编程的,这些日子我对他进行了全方位的摸索,感觉是爽呆了,下面我们一起来揭开它的神秘面纱,^_
VB
16,717
社区成员
110,522
社区内容
发帖
与我相关
我的任务
VB
VB技术相关讨论,主要为经典vb,即VB6.0
复制链接
扫一扫
分享
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章