社区
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#下也是这样的错误
请问如何解决
...全文
189
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
打赏
举报
回复
你怎么返回的?
(完整版)
vc6.0
编
写
DLL文件及vb
调用
示例.docx
本教程将详细介绍如何使用Microsoft Visual C++ 6.0(简称
VC6.0
)来创建DLL文件,并展示如何在Visual Basic(VB)中
调用
这些DLL中的函数。 首先,创建DLL文件的过程分为以下几个步骤: 1. **创建新工程**:在
VC6.0
...
VB
调用
VC的DLL,
【VB
调用
VC的DLL】知识点详解 在编程领域,不同语言之间的互操作性是一个重要的需求,例如Visual Basic (VB)这种高级语言可能需要
调用
由C++ (VC++)编译的动态链接库(DLL)来利用其底层性能优势。本篇文章将详细探讨...
用
VB.NET
进行UGNX二次开发
- UGNX提供了多种创建对话框的方法,包括使用内置的UIStyler工具、基于MFC的
VC6.0
开发环境以及.NET框架下的WinForm等。 - 使用UIStyler创建对话框时,可以指定对话框对应的编程语言,如C/C++、Java、C#、
VB.NET
等...
VC6.0
NTP时间服务器同步代码
- 在
VC6.0
中,我们需要首先
调用
`WSAStartup`初始化Winsock,然后使用`socket`函数创建一个套接字,`connect`函数连接到NTP服务器,最后使用`send`和`recv`发送和接收数据。 4. **NTP报文结构**: - NTP报文由多个...
vc6.0
免注册
调用
大漠
在软件开发领域,尤其是对于使用Visual C++ 6.0(简称
vc6.0
)进行Windows应用程序开发的技术人员来说,“免注册
调用
大漠”这一主题非常重要。这里的大漠通常指的是大漠插件(DM),一个广泛应用于自动化测试、图像...
VB
16,721
社区成员
110,522
社区内容
发帖
与我相关
我的任务
VB
VB技术相关讨论,主要为经典vb,即VB6.0
复制链接
扫一扫
分享
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章