我想再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熱心網友回復:
在64位Windows下:64位exe和dll在目錄c:\windows\system32目錄下;
32位exe和dll在目錄c:\windows\syswow64目錄下;
所以要注意:
在win64位系統下注冊32位ocx或dll需要將32位ocx或dll拷貝到c:\windows\syswow64\目錄下。
且注冊要用c:\windows\syswow64\regsvr32 xxxxxxx.ocx或dll
64 位 Windows 平臺注意點之檔案系統重定向 http://www.cnblogs.com/jiake/p/4981555.html
64 位 Windows 平臺注意點之注冊表重定向 http://www.cnblogs.com/jiake/p/4956218.html
uj5u.com熱心網友回復:
IDL語言不支持函式型別所以你的IDL本身就是錯的。要傳遞函式的話,可以用一個封裝類。IE對javascript函式的實作就是一個IDispatch,呼叫函式的方法是用0這個特殊的disp id來Invoke。
一些語言的型別系統不支持IDispatch,如果需要支持更多的語言(比如javascript),需要用VARIANT再封裝一次。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/68666.html
上一篇:MFC中如何利用ifstream和ofstream對串列框控制元件實作檔案的讀寫?
下一篇:關于注冊界面提示用戶名以注冊
