现在是这样的:
有个COM接口,其中有几个函数的参数是另外一个接口,不知道怎么调用,只有一个DLL,还有C#的调用定义,我想在C++里面调用,调用其中一个普通参数的方法是可以的,但是调用那种参数是另外一个接口的函数就失败,悲剧!求助啊!!!
C#的相关接口定义是这样的:
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("AD864139-4547-45e8-8981-C91F7C40AD69")]
internal interface ITicketManager
{
void GetAppID(Guid productId, out ulong appId);
void GetTicket(ulong appID, string TicketID, out ITicket Ticket);
}[ComImport, Guid("C66A047A-F755-4515-A573-F059C29736E2"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface ITicket
{
[PreserveSig]
int set_Property(uint propertyId, string propValue);
[PreserveSig]
int set_InvocationInfo(string TaskName, string taskParameters);
}
[ComImport, ClassInterface(ClassInterfaceType.None), Guid("248DD447-4295-4888-BC5A-5D87F3705F74")]
internal class TicketManager
{
}现在我在C++里面动态方式调用GetAppID是没问题的,但是调用GetTicket这个函数就不行,其中ITicket Ticket参数就是下面的那个ITicket接口,拜托大家了,有什么办法没????
有个COM接口,其中有几个函数的参数是另外一个接口,不知道怎么调用,只有一个DLL,还有C#的调用定义,我想在C++里面调用,调用其中一个普通参数的方法是可以的,但是调用那种参数是另外一个接口的函数就失败,悲剧!求助啊!!!
C#的相关接口定义是这样的:
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("AD864139-4547-45e8-8981-C91F7C40AD69")]
internal interface ITicketManager
{
void GetAppID(Guid productId, out ulong appId);
void GetTicket(ulong appID, string TicketID, out ITicket Ticket);
}[ComImport, Guid("C66A047A-F755-4515-A573-F059C29736E2"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface ITicket
{
[PreserveSig]
int set_Property(uint propertyId, string propValue);
[PreserveSig]
int set_InvocationInfo(string TaskName, string taskParameters);
}
[ComImport, ClassInterface(ClassInterfaceType.None), Guid("248DD447-4295-4888-BC5A-5D87F3705F74")]
internal class TicketManager
{
}现在我在C++里面动态方式调用GetAppID是没问题的,但是调用GetTicket这个函数就不行,其中ITicket Ticket参数就是下面的那个ITicket接口,拜托大家了,有什么办法没????
解决方案 »
- 求MFC中组合框选项利用数据库中表项值动态赋值的方法
- 关于用WinExec调用一个程序的问题
- 这里有没有高手能否帮忙解答一下关于驱动程序的问题
- Comobox:为什么隐藏时用UpdateData(false) 无法奏效
- 通过IWebBrowser2的Navigate2来打开网页,怎样判断网页是否全部加载完毕
- 问个很菜的问题,窗口是进程还是线程?为什么?
- e:\VS.NET\MainFrm.cpp(201): error C2361: “default”标签跳过“myop”的初始化操作
- 我用ACCESS 2000建了一个数据库,可惜打不开?
- 关于Socket多线程的问题!
- 【急】MFC static控件做MoveWindow以后,背景透明属性改变
- CreateProcess WaitForSingleObject 句柄无效
- VS2010中两个CMFCToolBar工具栏如何对接在一起呢
void GetTicket(ulong appID, string TicketID, ITicket** Ticket);
如果是函数返回的,就是
ITicket* Ticket GetTicket(ulong appID, string TicketID)
[
object,
uuid(C66A047A-F755-4515-A573-F059C29736E2),
dual,
nonextensible,
helpstring("ITicket Interface"),
pointer_default(unique)
]
interface ITicket:IUnknown{
HRESULT set_Property([in] unsigned long propertyId,[in] BSTR propValue);
HRESULT set_InvocationInfo([in] BSTR TaskName,[in] BSTR taskParameters);
}[
object,
uuid(AD864139-4547-45e8-8981-C91F7C40AD69),
dual,
nonextensible,
helpstring("ITicketManager Interface"),
pointer_default(unique)
]
interface ITicketManager: IUnknown{
HRESULT GetAppID(GUID productId,[out] unsigned long *appId);
HRESULT GetTicket ([in] unsigned long appID,[in] BSTR tokenID,[out] ITicket* Token);
};
// not needed GUID
[
uuid(A18935E0-C27A-48e2-B84B-2219B6967EA6),
version(1.0),
helpstring("TicketManager1.0 Type Library")
]
// contains the coclass-GUID
library TicketManagerLib
{
importlib("stdole2.tlb");
interface IDocHostUIHandlerDispatch;
interface IAxWinAmbientDispatchEx;
[
uuid(248DD447-4295-4888-BC5A-5D87F3705F74),
helpstring("TicketManagerClass")
]
coclass TokenManager
{
[default] interface ITicketManager;
};
};但是调用的时候GetAppID这个函数没问题,GetTicket 这个函数就不行,我用的是DllGetClassObject这种方式调用的
Logger::Instance().Log(LOG_INFO, _T("get DllGetClassObject method - Success."));
IClassFactory* pICF = NULL;
HRESULT hr = CreateInstance(__uuidof(TicketManager),IID_IClassFactory,(void**)&pICF);
if(SUCCEEDED(hr))
{
TicketManager* pTicketManager=NULL;
HRESULT hr2 = pICF->CreateInstance(NULL,__uuidof(ITicketManager),(void**)&pITicketManager);
if (SUCCEEDED(hr2))
{
ITicket** Ticket=NULL;
HRESULT hr3=pITicketManager->GetTicket(9530930203693022559,L"ticket1",Ticket);
if (SUCCEEDED(hr3))
{
Logger::Instance().Log(LOG_INFO, _T("Invoke interface method OK."));
}
else
{
Logger::Instance().Log(LOG_ERROR, _T("Invoke interface ITicket method filed:%x"),GetLastError());
}
pTicketManager->Release();
}
pICF->Release();
}
}
FreeLibrary(hi);
}
return 0;
HINSTANCE hi= ::LoadLibrary(L"xxxx.dll");if(hi!=NULL)
{
Logger::Instance().Log(LOG_INFO, _T("dll loaded."));
pfnHello CreateInstance = (pfnHello)::GetProcAddress(hi,L"DllGetClassObject");
if(CreateInstance!=NULL)
{
Logger::Instance().Log(LOG_INFO, _T("get DllGetClassObject method - Success."));
IClassFactory* pICF = NULL;
HRESULT hr = CreateInstance(__uuidof(TicketManager),IID_IClassFactory,(void**)&pICF);
if(SUCCEEDED(hr))
{
TicketManager* pTicketManager=NULL;
HRESULT hr2 = pICF->CreateInstance(NULL,__uuidof(ITicketManager),(void**)&pITicketManager);
if (SUCCEEDED(hr2))
{
ITicket** Ticket=NULL;
HRESULT hr3=pITicketManager->GetTicket(9530930203693022559,L"ticket1",Ticket);
if (SUCCEEDED(hr3))
{
Logger::Instance().Log(LOG_INFO, _T("Invoke interface method OK."));
}
else
{
Logger::Instance().Log(LOG_ERROR, _T("Invoke interface ITicket method filed:%x"),GetLastError());
}
pTicketManager->Release();
}
pICF->Release();
}
}
FreeLibrary(hi);
}
return 0;
HRESULT hr3=pITicketManager->GetTicket(9530930203693022559,L"ticket1",Ticket);
错误, 改为
ITicket* Ticket;
HRESULT hr3=pITicketManager->GetTicket(9530930203693022559,L"ticket1",&Ticket);
记得Release Ticket
HRESULT GetTicket ([in] unsigned long appID,[in] BSTR tokenID,[out] ITicket *Token);调用的时候:
ITicket *Ticket;
HRESULT hr3=pITicketManager->GetTicket(9530930203693022559,L"ticket1",Ticket);
调用失败,hr3是:0x80070057
// 这里是指针的指针
HRESULT GetTicket ([in] unsigned long appID,[in] BSTR tokenID,[out] ITicket **Token);ITicket *Ticket;
// 这里传地址
HRESULT hr3=pITicketManager->GetTicket(9530930203693022559,L"ticket1",&Ticket);你用点心, 别心浮气躁的
还是不行,
HRESULT GetTicket ([in] unsigned long appID,[in] BSTR tokenID,[out] ITicket **Token);ITicket *Ticket;
// 这里传地址
HRESULT hr3=pITicketManager->GetTicket(9530930203693022559,L"ticket1",&Ticket);程序直接挂掉了