写一个x64的工程,有个库是32位的,不能直接调用。所以创建了一个com服务器(EXE),将32位库的dll里的函数封装到com服务器里。
但是,dll(lib里有些函数是自命名的类,不是"oaidl.idl"包含的long , char那些类),在com中.idl文件中识别不出来,报俩错误:
1>.\ComCaffe.idl(20): error MIDL2025: syntax error : expecting a type specification near "HC_VMT_NET_LoginProc"
1>.\ComCaffe.idl(20): error MIDL2026: cannot recover from earlier syntax errors; aborting compilation
如图:
方法是自己手动添加进去的,因为没有它提供的类。
类定义在那个32位的库里,
所以这个bug是和windows sdk有关系还是说 就不能这样用自己定义的类?
所以,通过com服务器能把32位的dll引用到64位程序里去吗,现在该如何操作,来一个详细点的解答吧,谢谢各位大神!
https://bbs.csdn.net/topics/380251019
// ComCaffe.idl : ComCaffe 的 IDL 源
//
// 此文件将由 MIDL 工具处理以
// 产生类型库(ComCaffe.tlb)和封送处理代码。
import "oaidl.idl";
import "ocidl.idl";
typedef bool(*HC_VMT_NET_LoginProc)(char* strIp, WORD wPort, DWORD dwError, DWORD dwUser);
typedef bool(*HC_VMT_NET_ErrorProc)(char* strip, WORD wPort, DWORD dwUser);
typedef bool(*HC_VMT_NET_MessageProc)(char* cmd, char* buf, int size, DWORD dwUser);
typedef bool(*HC_VMT_NET_PlayErrorProc)(DWORD hPlayer, DWORD dwUser);
typedef int(*HC_VMT_NET_PPlayProc)(
int hPlay,
int status,
BYTE* yuv,
BYTE* y,
BYTE* u,
BYTE* v,
int w,
int h,
DWORD dwUser);
typedef int(*HC_VMT_NET_PStreamMessageProc)(
long hPlay,
char* cmd,
char* buf,
DWORD nUser);
typedef struct GTHC_VMT_NET_GROUP_STRU
{
char id[HC_VMT_NET_MAX_RES_LEN];
char name[HC_VMT_NET_MAX_URL_UNIT];
} GTHC_VMT_NET_GROUP;
typedef struct GTHC_VMT_NET_LAYOUT_STRU
{
char id[HC_VMT_NET_MAX_RES_LEN];
char name[HC_VMT_NET_MAX_URL_UNIT];
} GTHC_VMT_NET_LAYOUT;
typedef struct GTHC_VMT_NET_DEPT_STRU
{
char url[HC_VMT_NET_MAX_URL_UNIT];
} GTHC_VMT_NET_DEPT;
typedef struct GTHC_VMT_NET_RESOURCE_STRU
{
char url[HC_VMT_NET_MAX_URL_UNIT];
} GTHC_VMT_NET_RESOURCE;
[
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;
};
};