com中怎么传递自定义结构参数?

nicholas 2001-02-23 09:02:00
我在做一个activex控件的时候,属性的参数好像只能定义一个,而且必须是规定的那些类型。请问可不可以传入多个参数,或者自定义结构数组?
...全文
370 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
nicholas 2001-03-05
  • 打赏
  • 举报
回复
dearmite(笨!真笨啊!) :
你给的代码是传递数组的呀,
我现在有一个办法,根据机器对齐要求,把结构参数申明为一个相应类型的数据块指针和长度,比如long *plVal,int nSize,在调用方法和方法内部作相应转换就可以了。你们说怎样?
  • 打赏
  • 举报
回复
尤其是许多OCX,只是把一个数组名传过去就行,不知道是如何弄的,???
  • 打赏
  • 举报
回复
尤其是许多OCX,只是把一个数组名传过去就行,不知道是如何弄的,???
  • 打赏
  • 举报
回复
尤其是许多OCX,只是把一个数组名传过去就行,不知道是如何弄的,???
  • 打赏
  • 举报
回复
尤其是许多OCX,只是把一个数组名传过去就行,不知道是如何弄的,???
  • 打赏
  • 举报
回复
但我认为VARIANT的方法好得多,
  • 打赏
  • 举报
回复
但我认为VARIANT的方法好得多,
  • 打赏
  • 举报
回复
但我认为VARIANT的方法好得多,
  • 打赏
  • 举报
回复
但我认为VARIANT的方法好得多,
  • 打赏
  • 举报
回复
CoInitialize(NULL);
CLSID m_clsid;
USES_CONVERSION;
::CLSIDFromString(T2OLE("ROUNDANALOG.RoundAnlgAARCtrl.1"), &m_clsid);
IDispatch FAR* pObj = (IDispatch FAR*)NULL;
CString str = "UpdateControl";
BSTR bstr = str.AllocSysString();
HRESULT hr = CoCreateInstance(m_clsid, NULL, CLSCTX_ALL, IID_IDispatch,
(void**)&pObj);

SafeArrayAccessData(psa, (void**)&bstrArray);
bstrArray[0] = str.AllocSysString();
bstrArray[1] = str.AllocSysString();
SafeArrayUnaccessData(psa);

VARIANTARG* pvars = new VARIANTARG[1];
VariantInit(&pvars[0]);
pvars[0].vt = VT_ARRAY|VT_BYREF|VT_BSTR;
pvars[0].pparray = &psa;
DISPID dispid;

hr = pObj->GetIDsOfNames(IID_NULL, &bstr, 1,LOCALE_USER_DEFAULT, &dispid);

DISPPARAMS disp = {pvars, &dispid, 1,1};
hr = pObj->Invoke(dispid, IID_NULL,
LOCALE_USER_DEFAULT,DISPATCH_PROPERTYPUT,&disp,NULL, NULL, NULL);
delete[] pvars;
pObj->Release();
CoUninitialize();

这是一个朋友给的,我不太懂,
  • 打赏
  • 举报
回复
CoInitialize(NULL);
CLSID m_clsid;
USES_CONVERSION;
::CLSIDFromString(T2OLE("ROUNDANALOG.RoundAnlgAARCtrl.1"), &m_clsid);
IDispatch FAR* pObj = (IDispatch FAR*)NULL;
CString str = "UpdateControl";
BSTR bstr = str.AllocSysString();
HRESULT hr = CoCreateInstance(m_clsid, NULL, CLSCTX_ALL, IID_IDispatch,
(void**)&pObj);

SafeArrayAccessData(psa, (void**)&bstrArray);
bstrArray[0] = str.AllocSysString();
bstrArray[1] = str.AllocSysString();
SafeArrayUnaccessData(psa);

VARIANTARG* pvars = new VARIANTARG[1];
VariantInit(&pvars[0]);
pvars[0].vt = VT_ARRAY|VT_BYREF|VT_BSTR;
pvars[0].pparray = &psa;
DISPID dispid;

hr = pObj->GetIDsOfNames(IID_NULL, &bstr, 1,LOCALE_USER_DEFAULT, &dispid);

DISPPARAMS disp = {pvars, &dispid, 1,1};
hr = pObj->Invoke(dispid, IID_NULL,
LOCALE_USER_DEFAULT,DISPATCH_PROPERTYPUT,&disp,NULL, NULL, NULL);
delete[] pvars;
pObj->Release();
CoUninitialize();

这是一个朋友给的,我不太懂,
  • 打赏
  • 举报
回复
CoInitialize(NULL);
CLSID m_clsid;
USES_CONVERSION;
::CLSIDFromString(T2OLE("ROUNDANALOG.RoundAnlgAARCtrl.1"), &m_clsid);
IDispatch FAR* pObj = (IDispatch FAR*)NULL;
CString str = "UpdateControl";
BSTR bstr = str.AllocSysString();
HRESULT hr = CoCreateInstance(m_clsid, NULL, CLSCTX_ALL, IID_IDispatch,
(void**)&pObj);

SafeArrayAccessData(psa, (void**)&bstrArray);
bstrArray[0] = str.AllocSysString();
bstrArray[1] = str.AllocSysString();
SafeArrayUnaccessData(psa);

VARIANTARG* pvars = new VARIANTARG[1];
VariantInit(&pvars[0]);
pvars[0].vt = VT_ARRAY|VT_BYREF|VT_BSTR;
pvars[0].pparray = &psa;
DISPID dispid;

hr = pObj->GetIDsOfNames(IID_NULL, &bstr, 1,LOCALE_USER_DEFAULT, &dispid);

DISPPARAMS disp = {pvars, &dispid, 1,1};
hr = pObj->Invoke(dispid, IID_NULL,
LOCALE_USER_DEFAULT,DISPATCH_PROPERTYPUT,&disp,NULL, NULL, NULL);
delete[] pvars;
pObj->Release();
CoUninitialize();

这是一个朋友给的,我不太懂,
  • 打赏
  • 举报
回复
CoInitialize(NULL);
CLSID m_clsid;
USES_CONVERSION;
::CLSIDFromString(T2OLE("ROUNDANALOG.RoundAnlgAARCtrl.1"), &m_clsid);
IDispatch FAR* pObj = (IDispatch FAR*)NULL;
CString str = "UpdateControl";
BSTR bstr = str.AllocSysString();
HRESULT hr = CoCreateInstance(m_clsid, NULL, CLSCTX_ALL, IID_IDispatch,
(void**)&pObj);

SafeArrayAccessData(psa, (void**)&bstrArray);
bstrArray[0] = str.AllocSysString();
bstrArray[1] = str.AllocSysString();
SafeArrayUnaccessData(psa);

VARIANTARG* pvars = new VARIANTARG[1];
VariantInit(&pvars[0]);
pvars[0].vt = VT_ARRAY|VT_BYREF|VT_BSTR;
pvars[0].pparray = &psa;
DISPID dispid;

hr = pObj->GetIDsOfNames(IID_NULL, &bstr, 1,LOCALE_USER_DEFAULT, &dispid);

DISPPARAMS disp = {pvars, &dispid, 1,1};
hr = pObj->Invoke(dispid, IID_NULL,
LOCALE_USER_DEFAULT,DISPATCH_PROPERTYPUT,&disp,NULL, NULL, NULL);
delete[] pvars;
pObj->Release();
CoUninitialize();

这是一个朋友给的,我不太懂,
  • 打赏
  • 举报
回复
关注,!!!!!!!!!!!!!!!!!
  • 打赏
  • 举报
回复
关注,!!!!!!!!!!!!!!!!!
  • 打赏
  • 举报
回复
关注,!!!!!!!!!!!!!!!!!
coolfired 2001-02-27
  • 打赏
  • 举报
回复
说是com,实际上和调用端还是有关联,比如vbscript的数据类型就很局限.
netrouter 2001-02-27
  • 打赏
  • 举报
回复
你可以参考微软的关于组件的书,Inside COM+ Base Services(组件编程技术内幕)其中提到了如何传递自定义结构参数。以下摘自该书:
要采用UDT作为方法的参数,需要首先在IDL文件中定义该结构,然后用MIDL来生成类型库。例:
在IDL文件中
typedef[ uuid(10000099-0000-000...)
struct myDataType {
int x;
int y;
} myDataType
书中还提到了另一种方法,但我看不太懂,你最好自己研究研究。

nicholas 2001-02-26
  • 打赏
  • 举报
回复
是啊,一般的com组件可以散集结构的。那在activex中没办法传递结构了?
luxyi 2001-02-26
  • 打赏
  • 举报
回复
你指的ActiveX如果是control的话,确实不能。因为control的接口是继承IDispatch的。
加载更多回复(6)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧