我想在x64工程中呼叫一個32位的庫,所以無奈要將32位庫封裝到Com服務器中,
但是在寫介面描述檔案idl時,發現庫中的引數別類無法被識別,報錯。
查了下,有說windows sdk的問題的,有說類別不能識別問題的,應該是后者,我裝vs的時候和后來都沒有遇到sdk的問題。
所以,idl檔案中怎樣正確的添加自定義的類別,引數可以是函式嗎??

貼代碼:
// ComCaffe.idl : ComCaffe 的 IDL 源
//
// 此檔案將由 MIDL 工具處理以
// 產生型別庫(ComCaffe.tlb)和封送處理代碼。
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(1FAFCF35-AF35-45ED-BD61-B7DB1B08C816),
dual,
nonextensible,
pointer_default(unique)
]
interface ISimpleObject : IDispatch{
[id(1)] HRESULT ComServiceGTHC_VMT_NET_SetCallBack([in] HC_VMT_NET_LoginProc pLoginProc, [in] HC_VMT_NET_ErrorProc pErrProc, [in] HC_VMT_NET_MessageProc pMsgProc, [in] HC_VMT_NET_PlayErrorProc pLiveErrProc, [in] DWORD dwUser, [out, retval] LONG* ret);
[id(2)] HRESULT ComServiceGTHC_VMT_NET_PTZCtrl([in] char* resId, [in] char* URL, [out, retval] LONG* ret);
[id(3)] HRESULT ComServiceGTHC_VMT_NET_PlayOpen([in] LONG *hPlayer, [in] HWND hWnd, [in] char* resource, [in] char* URL, [in] HC_VMT_NET_PPlayProc playProc, [in] DWORD playProcUser, [in] HC_VMT_NET_PStreamMessageProc msgProc, [out, retval] LONG* ret);
[id(4)] HRESULT ComServiceGTHC_VMT_NET_PlayCtrl([in] LONG hPlayer, [in] char* URL, [out, retval] LONG* ret);
[id(5)] HRESULT ComServiceGTHC_VMT_NET_PlayClose([in] LONG hPlayer, [out, retval] LONG* ret);
[id(6)] HRESULT ComServiceGTHC_VMT_NET_Logout([out, retval] LONG* ret);
[id(7)] HRESULT ComServiceGTHC_VMT_NET_Login([in]char* strip, [in]WORD wPort, [in] char* username, [in] char* password, [in]int version, [out, retval] LONG* ret);
[id(8)] HRESULT ComServiceGTHC_VMT_NET_LayoutSize([out, retval] LONG* ret);
[id(9)] HRESULT ComServiceGTHC_VMT_NET_LayoutGroupSize([in] const char* layoutId, [out, retval] LONG* ret);
[id(10)] HRESULT ComServiceGTHC_VMT_NET_LayoutGroup([in] const char* layoutId, [in] GTHC_VMT_NET_GROUP *pGroup, [in] int size, [out, retval] LONG* ret);
[id(11)] HRESULT ComServiceGTHC_VMT_NET_Layout([in] GTHC_VMT_NET_LAYOUT *pLayout, [in]int size, [out, retval] LONG* ret);
[id(12)] HRESULT ComServiceGTHC_VMT_NET_InitLib([in] VARIANT_BOOL cache_data, [out, retval] LONG* ret);
[id(13)] HRESULT ComServiceGTHC_VMT_NET_GroupResourceSize([in] const char* layoutId, [in] int *deptSize, [in]const char* groupId, [in] int *resSize, [out, retval] LONG* ret);
[id(14)] HRESULT ComServiceGTHC_VMT_NET_GroupResource([in] const char* layoutId, [in] const char* groupId, [in] GTHC_VMT_NET_DEPT *pDept, [in] int deptSize, [in] GTHC_VMT_NET_RESOURCE *pRes, [in] int resSize, [out, retval] LONG* ret);
[id(15)] HRESULT ComServiceGTHC_VMT_NET_GetRes([in] char *resId, [in] GTHC_VMT_NET_RESOURCE *pRes, [out, retval] LONG* ret);
[id(16)] HRESULT ComServiceGTHC_VMT_NET_GetPreset([in]const char* user, [out, retval] LONG* ret);
[id(17)] HRESULT ComServiceGTHC_VMT_NET_FiniLib([out, retval] LONG* ret);
[id(18)] HRESULT ComServiceGTHC_VMT_NET_AlarmResSize([in] int type, [out, retval] LONG* size);
[id(19)] HRESULT ComServiceGTHC_VMT_NET_AlarmRes([in]int type, [in] GTHC_VMT_NET_RESOURCE *pRes, [in] int size, [out, retval] LONG* ret);
};
[
uuid(151ECCAB-F5C8-4E40-A606-5769278E4C68),
version(1.0),
]
library ComCaffeLib
{
importlib("stdole2.tlb");
[
uuid(92579859-BB5A-45AE-A6F3-38C28D84F72A)
]
coclass SimpleObject
{
[default] interface ISimpleObject;
};
};
引數的類別由我想封裝的dll lib對應的.h中定義:

謝謝各位大神
uj5u.com熱心網友回復:
IDL語言不支持HC_VMT_NET_PlayErrorProc這樣的函式型別你可以像IE這樣用IDispatch給函式做一個封裝類,Invoke的時候呼叫你的函式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/68678.html
下一篇:關于C++元件的函式查看問題
