MFC项目,勾选了AUTOMATION使用CHtmlView,在View中打开了一个网页。目的是想返回结构体给网页里边的JAVASCRIPT使用。-------------------------------------------------------问题1
问题是代码时运行出错。在网上查了资料,想要返回UDT,那么返回的类型是要VARIANT,然后vt=VT_RECORD,设置pRecInfo,与pvRecord我在typelib中定义了一个结构体。然后在测试方法里获取IRecordInfo。new相应的结构体。返回。但是出错。-------------------------------------------------------问题2
在做的过程中遇到的问题是如何获取IRecordInfo。查到了2个方法,一个是GetRecordInfoFromGuids另一个是loadTypeLib,然后GetTypeInfoOfGuid,再到GetRecordInfoFromTypeInfo本来是用第一种方法获取,但是断点看到没有注册,结果找不到在MFC中如何注册的相关资料(之前接触过一下ATL,编译的时候就已经自动注册了,根据相应的rgs文件,但是MFC的reg文件里边只有COCLASS的注册信息,不懂具体是哪里的问题),放弃。改用第二种……通过TLB获取IRecordInfo,使用这种方法是可以获取到IRecordInfo,但是运行出错,这里回到问题1。--------------------------------------------------------这里是IDL[ uuid(B689A0FC-10F2-44B6-87E6-5D515BB715D1), version(1.0) ]
library bdc2
{
importlib("stdole32.tlb");
importlib("stdole2.tlb"); //  Primary dispatch interface for Cbdc2Doc

[ uuid(151FB8DC-2C97-4488-94E0-1F9DE394AB4A) ]
dispinterface Ibdc2
{
properties:

methods:
[id(1)] VARIANT testMethod(void);
}; [ uuid(A762E68B-51B9-4F06-997C-4CE1195CF391) ]
typedef struct CmTagInfo{
LONG64 tagId;
LONG64 userId;
BSTR tag;
LONG64 amount;
}CmTagInfo; //  Class information for Cbdc2Doc

[ uuid(659613E5-5538-4259-9B18-E80669874281) ]
coclass Cbdc2Doc
{
[default] dispinterface Ibdc2;
};
};--------------------------------------------------------下边是testMethod的代码VARIANT Cbdc2Doc::testMethod(void)
{
AFX_MANAGE_STATE(AfxGetAppModuleState()); VARIANT vaResult;
VariantInit(&vaResult); // TODO: Add your dispatch handler code here

ITypeLib* pTypeLib;
HRESULT hr = LoadTypeLib(OLESTR("bdc2.tlb"), &pTypeLib);
if (FAILED(hr)) {
MessageBox(NULL, _T("aa"), _T("aa"), 0);
return vaResult;
} ITypeInfo* pTypeInfo;
hr = pTypeLib->GetTypeInfoOfGuid(GUID_TAGINFO, &pTypeInfo);
if (FAILED(hr)) {
MessageBox(NULL, _T("bb"), _T("bb"), 0);
return vaResult;
} /*
hr = pTypeLib->GetTypeInfo(0, &pTypeInfo);
if (FAILED(hr)) {
MessageBox(NULL, _T("cc"), _T("cc"), 0);
return vaResult;
}
*/

pTypeLib->Release();
IRecordInfo* pRecInfo;
hr = GetRecordInfoFromTypeInfo(pTypeInfo, &pRecInfo);
pTypeInfo->Release();
if (FAILED(hr)) {
MessageBox(NULL, _T("dd"), _T("dd"), 0);
return vaResult;
}
vaResult.vt = VT_RECORD;
vaResult.pRecInfo = pRecInfo; CmTagInfo* pTagInfo = new CmTagInfo;
pTagInfo->tagId = 1;
pTagInfo->userId = 2;
pTagInfo->tag = SysAllocString(L"Hello");;
pTagInfo->amount = 3; vaResult.pvRecord = pTagInfo;  //vaResult.vt = VT_INT;
//vaResult.intVal = 1; return vaResult;
}