结构指针如何传入COM组件中去
就是下面的 lpPinGetData结构指针如何传入到CSPPIN_COM 中去
以下是调用COM组件的函数
WFSPINGETDATA * lpPinGetData;
pIPin->WFPExecute_COM(hService,dwCommand,(VARIANT *)lpPinGetData ,dwTimeOut,(ULONG)hWnd,ReqID);
以下是COM组件的函数 lpCmdData是要传入的参数。
STDMETHODIMP CSPPIN_COM::WFPExecute_COM(short hService, ULONG dwCommand, VARIANT * lpCmdData, ULONG dwTimeOut, ULONG hWnd, ULONG ReqID)
但我这样传入的的指针数据传送不对。请教能把结构指针传入到COM组件中去的方法。
问题点数:100、回复次数:11Top
1 楼WuOu(天堂*蓝珀湖*仰音*诚彦)回复于 2005-06-01 17:05:49 得分 0
UPTop
2 楼dongfa(一桶江湖( http://www.codelive.net ))回复于 2005-06-01 17:22:55 得分 0
如果是进程内,可以不使用 VARIANT
直接使用 void *pCmdData
假设你的结构为CMDDATA
CMDDATA * = (CMDDATA *)pCmdData;
Top
3 楼sinall()回复于 2005-06-01 18:32:30 得分 0
进程内组件用long传地址,过去做强制类型转换。
比如:
STDMETHODIMP CObj::WFPExecute_COM(long lpCmdData)
{
// TODO: Add your implementation code here
struct Date *date=(struct Date *)lpCmdData;
return S_OK;
}
void CClientDlg::OnButton1()
{
// TODO: Add your control notification handler code here
::CoInitialize(NULL);
{
struct Date date;
IObjPtr pObj;
pObj.CreateInstance(__uuidof(Obj));
pObj->WFPExecute_COM((long)&date);
}
::CoUninitialize();
}
Top
4 楼DTH()回复于 2005-06-01 21:56:16 得分 0
谢谢!但我这个是进程外的组件!
用以上的方法还是不行!
求达人解题!Top
5 楼dongfa(一桶江湖( http://www.codelive.net ))回复于 2005-06-02 13:11:39 得分 60
进程外不能直接传,使用SafeArray
VARIANT *pVar = new VARIANT;
VariantInit(pVar);
pVar->vt = VT_ARRAY | VT_UI1;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].cElements = dwSize; // 缓冲大小,也就是你结构的大小
rgsabound[0].lLbound = 0;
pVar->parray = SafeArrayCreate(VT_UI1, 1, rgsabound);
if(pVar->parray != NULL)
{
void *pArrayData = NULL;
if(SUCCEEDED(SafeArrayAccessData(pVar->parray, &pArrayData)))
{
// pStructBuffer 结构数据指针
memcpy(pArrayData, pStructBuffer, dwSize);
ASSERT(lReal == dwSize);
hr = SafeArrayUnaccessData(pVar->parray);
}
}
pIPin->WFPExecute_COM(hService,dwCommand,pVar,dwTimeOut,(ULONG)hWnd,ReqID);
Top
6 楼jiangsheng(蒋晟.Net[MVP])回复于 2005-06-02 13:51:30 得分 0
把结构封装成自动化对象来操作也可以Top
7 楼DTH()回复于 2005-06-02 15:02:04 得分 0
dongfa(一桶江湖( http://adong2008.512j.com ))
谢了我试试!
jiangsheng(蒋晟.MSMVP2004Jan)
你所说的方法能否给个例子,谢了!Top
8 楼jiangsheng(蒋晟.Net[MVP])回复于 2005-06-02 15:06:16 得分 0
http://msdn.microsoft.com/library/en-us/vclib/html/_mfcnotes_tn065.aspTop
9 楼DTH()回复于 2005-06-04 00:40:37 得分 0
小弟不才,以上的方法好像都不行,望达人向助!!!!!Top
10 楼sinall()回复于 2005-06-04 08:47:18 得分 40
dongfa(一桶江湖( http://adong2008.512j.com )) 办法可行。
短消息给我E-Mail,我给你发Demo。
IDL:
struct _MyDate {
int num;
};
interface IObj : IDispatch
{
[id(1), helpstring("method WFPExecute_COM")] HRESULT WFPExecute_COM(VARIANT *pVar);
};
服务器端:
STDMETHODIMP CObj::WFPExecute_COM(VARIANT *pVar)
{
// TODO: Add your implementation code here
size_t dwSize=sizeof(_MyDate);
_MyDate StructBuffer;
HRESULT hr;
if(pVar->parray != NULL)
{
void *pArrayData = NULL;
if(SUCCEEDED(SafeArrayAccessData(pVar->parray, &pArrayData)))
{
// pStructBuffer 结构数据指针
memcpy(&StructBuffer, pArrayData, dwSize);
hr = SafeArrayUnaccessData(pVar->parray);
}
}
char msg[100];
sprintf(msg,"%d",StructBuffer.num);
MessageBox(NULL,msg,"",MB_OK);
return S_OK;
}
客户端:
void CClientDlg::OnButton1()
{
// TODO: Add your control notification handler code here
::CoInitialize(NULL);
{
VARIANT Var;
VARIANT *pVar = &Var;
size_t dwSize=sizeof(_MyDate);
_MyDate StructBuffer;
HRESULT hr;
StructBuffer.num=15;
VariantInit(pVar);
pVar->vt = VT_ARRAY | VT_UI1;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].cElements = dwSize; // 缓冲大小,也就是你结构的大小
rgsabound[0].lLbound = 0;
pVar->parray = SafeArrayCreate(VT_UI1, 1, rgsabound);
if(pVar->parray != NULL)
{
void *pArrayData = NULL;
if(SUCCEEDED(SafeArrayAccessData(pVar->parray, &pArrayData)))
{
// pStructBuffer 结构数据指针
memcpy(pArrayData, &StructBuffer, dwSize);
// ASSERT(lReal == dwSize);
hr = SafeArrayUnaccessData(pVar->parray);
}
}
IObjPtr pObj;
pObj.CreateInstance(__uuidof(Obj));
pObj->WFPExecute_COM(pVar);
}
::CoUninitialize();
}
Top
11 楼dawndu(东南飞)回复于 2005-06-04 20:39:46 得分 0
SafeArray乃正途也Top




