请问怎样在COM里把自定义的结构传出去 如:我在COM定义了一个STRUCT S{ BSTR name; BSTR id;}然后怎样把这个结构传到给其他程序(如ASP)调用?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在IDL文件中:uuid[.....]struct s{ BSTR name; BSTR id;} 如果仅仅只是要传递出一个结构,那么可以封装到VARIANT里再传递。至于怎么让ASP来调用,还得请高手了…… 再请问一下,那么这样把它封装再VARIANT里面,谢谢了 y_jx()写得对,后面的接口函数照直用就可以了。不过因为是非标准的数据类型,编译时会提出警告 我把结构都写成class,所有的member都变成public就可以了。一个COM中可以有很多class 我也是在idl中定义结构体,可以在app中调用,但是值传不过去,我定义的如下!typedef struct MYINFO { BYTE* pData; long lsize; }MYINFO;在app中如下使用:MYINFO* mydata; mydata->lsize=6; mydata->pData=NULL;显示非法访问信息 我解决了,只要放到idl中定义,在client中调用时候,注意分配内存就可以了! 在COM方法中传递结构类型(转贴)(作者:王廷正)在RPC的应用里,经常在接口方法中使用结构类型,COM的方法中也可以传递结构类型。就用一个实验简单测试一下在COM方法中传递结构类型。用ATL向导建立一个名字为structsmp的工程,加入一个简单对象MyTest继承接口名为ITestStruct。.在工程中加入一个文件mytypes.idl,在里面定义一个结构UserInfo如下:typedef struct{ long no; unsigned char name[255]; BSTR address;}UserInfo;在structsmp.idl的文件头部加入import “mytypes.idl”1. 加入第一个方法GetUserInfo HRESULT GetUserInfo([out,retval] UserInfo *pUserInfo);方法的实现如下:STDMETHODIMP CMyTest::GetUserInfo(UserInfo *pUserInfo){ pUserInfo->no=100; memcpy(pUserInfo->name,"Mona Lisa",10); pUserInfo->address=SysAllocString(L"Italy"); return S_OK;}下面用VB程序作为客户端来测试这个方法:新建一个VB的工程,引用此组件。定义组件对象: Dim obj As New STRUCTSMPLib.MyTest下面调用方法如下:Dim ui As userinfoui = obj.GetUserInfo()MsgBox ui.noMsgBox StrConv(ui.Name, vbUnicode)MsgBox ui.address运行的结果符合了我们的期望,这个实验已经踏出坚实的第一步了。2.下面在组件里添加第二个方法: HRESULT SetUserInfo([in] UserInfo *pUserInfo);STDMETHODIMP CMyTest::SetUserInfo(UserInfo *pUserInfo){ USES_CONVERSION; char info[255]; WriteLog("begin SetUserInfo function"); sprintf(info,"pUserInfo->no is:%d,pUserInfo->name is:%s,pUserInfo->address is:%s",pUserInfo->no,pUserInfo->name,OLE2T(pUserInfo->address)); WriteLog(info); return S_OK;}WriteLog函数是一个把信息写进文件的函数。在VB的客户程序里:Dim ui As userinfoui.no = 101ui.Name(0) = Asc("h")ui.Name(1) = Asc("e")ui.Name(2) = Asc("l")ui.Name(3) = Asc("l")ui.Name(4) = Asc("o")ui.address = "world"obj.SetUserInfo ui查看最终的结果,又是正确的,这次的结果让人信心倍增。3.从现在来看对单个结构在接口方法里传递没有任何的问题,下面就是该考虑结构数组的时候了,一口气添加两个方法,请看:在接口里添加两个方法,传递结构数组,并且在方法的实现里写上测试的代码。 HRESULT SetUserInfoArray([in] long cMax,[in,size_is(cMax)] UserInfo *pUserInfo); HRESULT GetUserInfoArray([in] long cMax,[out,size_is(cMax)] UserInfo *pUserInfo);STDMETHODIMP CMyTest::SetUserInfoArray(long cMax, UserInfo *pUserInfo){ USES_CONVERSION; char info[255]; WriteLog("begin SetUserInfoArray function"); for(int i=0;i<cMax;i++) { sprintf(info,"%d:pUserInfo->no is:%d,pUserInfo->name is:%s,pUserInfo->address is:%s",i+1,pUserInfo->no,pUserInfo->name,OLE2T(pUserInfo->address)); WriteLog(info); pUserInfo++; } return S_OK;}STDMETHODIMP CMyTest::GetUserInfoArray(long cMax, UserInfo *pUserInfo){ for(int i=0;i<cMax;i++) { pUserInfo->no=100; memcpy(pUserInfo->name,"Mona Lisa",10); pUserInfo->address=SysAllocString(L"Italy"); pUserInfo++; } return S_OK;}现在在VB的客户程序里加上测试这两个方法的代码:Dim ui(9) As userinfoobj.GetUserInfoArray 10, ui(0)For i = 0 To 9Debug.Print ui(i).noDebug.Print StrConv(ui(i).Name, vbUnicode)Debug.Print ui(i).addressNext和Dim ui(9) As userinfoFor i = 0 To 9ui(i).no = 101ui(i).Name(0) = Asc("h")ui(i).Name(1) = Asc("e")ui(i).Name(2) = Asc("l")ui(i).Name(3) = Asc("l")ui(i).Name(4) = Asc("o")ui(i).address = "world"Nextobj.SetUserInfoArray 10, ui(0)ACTION的结果可以说让我们欣喜若狂,结构类型在接口里畅通无阻。4.远程调用狂喜过后我们又要进行下一步的实验,这一次针对的是结构类型的方法在远程调用中的特性。在这里我们使用系统提供的代理dllhost.exe和标准调度,客户程序是一个控制台程序。这一次结构类型又不负众望顺利过关,表现的非常完美。到此实验就OVER了,以后可以放心大胆的在COM的方法里使用结构类型啦。 【STM32】通讯问题,通过USB接口? CHttpFile POST 出问题了 实例化自身类? 关于listctrl的问题一个~ 怎样检测程序是否已运行?(让程序只运行一遍!) 如何让程序运行时最小化,不出现界面,基于cview的单文档程序 应该很简单的问题 单步调试 人世间最美好的是美女那魔鬼般的身体,最丑恶的是美女那毒蝎般的心肠,同意者POP,人人有分! vc6中动态连接库的问题 一个困扰我很久的问题!各位帮忙看看吧!up有分!不够另开! 线程同步问题(关于Mutex)!
uuid[.....]
struct s
{
BSTR name;
BSTR id;
}
至于怎么让ASP来调用,还得请高手了……
一个COM中可以有很多class
typedef struct MYINFO
{
BYTE* pData;
long lsize;
}MYINFO;在app中如下使用:MYINFO* mydata;
mydata->lsize=6;
mydata->pData=NULL;
显示非法访问信息
(作者:王廷正)在RPC的应用里,经常在接口方法中使用结构类型,COM的方法中也可以传递结构类型。就用一个实验简单测试一下在COM方法中传递结构类型。用ATL向导建立一个名字为structsmp的工程,加入一个简单对象MyTest继承接口名为ITestStruct。.
在工程中加入一个文件mytypes.idl,在里面定义一个结构UserInfo如下:
typedef struct
{
long no;
unsigned char name[255];
BSTR address;
}UserInfo;在structsmp.idl的文件头部加入import “mytypes.idl”1. 加入第一个方法GetUserInfo
HRESULT GetUserInfo([out,retval] UserInfo *pUserInfo);
方法的实现如下:
STDMETHODIMP CMyTest::GetUserInfo(UserInfo *pUserInfo)
{
pUserInfo->no=100;
memcpy(pUserInfo->name,"Mona Lisa",10);
pUserInfo->address=SysAllocString(L"Italy");
return S_OK;
}下面用VB程序作为客户端来测试这个方法:新建一个VB的工程,引用此组件。定义组件对象:
Dim obj As New STRUCTSMPLib.MyTest下面调用方法如下:
Dim ui As userinfo
ui = obj.GetUserInfo()
MsgBox ui.no
MsgBox StrConv(ui.Name, vbUnicode)
MsgBox ui.address运行的结果符合了我们的期望,这个实验已经踏出坚实的第一步了。2.下面在组件里添加第二个方法:
HRESULT SetUserInfo([in] UserInfo *pUserInfo);STDMETHODIMP CMyTest::SetUserInfo(UserInfo *pUserInfo)
{
USES_CONVERSION;
char info[255];
WriteLog("begin SetUserInfo function");
sprintf(info,"pUserInfo->no is:%d,pUserInfo->name is:%s,pUserInfo->address is:%s",pUserInfo->no,pUserInfo->name,OLE2T(pUserInfo->address));
WriteLog(info);
return S_OK;
}WriteLog函数是一个把信息写进文件的函数。在VB的客户程序里:Dim ui As userinfo
ui.no = 101
ui.Name(0) = Asc("h")
ui.Name(1) = Asc("e")
ui.Name(2) = Asc("l")
ui.Name(3) = Asc("l")
ui.Name(4) = Asc("o")
ui.address = "world"
obj.SetUserInfo ui查看最终的结果,又是正确的,这次的结果让人信心倍增。3.从现在来看对单个结构在接口方法里传递没有任何的问题,下面就是该考虑结构数组的时候了,一口气添加两个方法,请看:在接口里添加两个方法,传递结构数组,并且在方法的实现里写上测试的代码。
HRESULT SetUserInfoArray([in] long cMax,[in,size_is(cMax)] UserInfo *pUserInfo);
HRESULT GetUserInfoArray([in] long cMax,[out,size_is(cMax)] UserInfo *pUserInfo);STDMETHODIMP CMyTest::SetUserInfoArray(long cMax, UserInfo *pUserInfo)
{
USES_CONVERSION;
char info[255];
WriteLog("begin SetUserInfoArray function");
for(int i=0;i<cMax;i++)
{
sprintf(info,"%d:pUserInfo->no is:%d,pUserInfo->name is:%s,pUserInfo->address is:%s",i+1,pUserInfo->no,pUserInfo->name,OLE2T(pUserInfo->address));
WriteLog(info);
pUserInfo++;
}
return S_OK;
}STDMETHODIMP CMyTest::GetUserInfoArray(long cMax, UserInfo *pUserInfo)
{
for(int i=0;i<cMax;i++)
{
pUserInfo->no=100;
memcpy(pUserInfo->name,"Mona Lisa",10);
pUserInfo->address=SysAllocString(L"Italy");
pUserInfo++;
}
return S_OK;
}现在在VB的客户程序里加上测试这两个方法的代码:Dim ui(9) As userinfo
obj.GetUserInfoArray 10, ui(0)
For i = 0 To 9
Debug.Print ui(i).no
Debug.Print StrConv(ui(i).Name, vbUnicode)
Debug.Print ui(i).address
Next和Dim ui(9) As userinfo
For i = 0 To 9
ui(i).no = 101
ui(i).Name(0) = Asc("h")
ui(i).Name(1) = Asc("e")
ui(i).Name(2) = Asc("l")
ui(i).Name(3) = Asc("l")
ui(i).Name(4) = Asc("o")
ui(i).address = "world"
Next
obj.SetUserInfoArray 10, ui(0)ACTION的结果可以说让我们欣喜若狂,结构类型在接口里畅通无阻。4.远程调用
狂喜过后我们又要进行下一步的实验,这一次针对的是结构类型的方法在远程调用中的特性。在这里我们使用系统提供的代理dllhost.exe和标准调度,客户程序是一个控制台程序。这一次结构类型又不负众望顺利过关,表现的非常完美。到此实验就OVER了,以后可以放心大胆的在COM的方法里使用结构类型啦。