组件调用提示E_NOINTERFACE的问题
我刚学COM,遇到个问题,试了几天也没搞明白,希望那位高手指点下,不胜感激!
待使用的组件只提供一个库文件OpenSTAADUI.tlb
在VB中通过下面的调用没有问题。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim objOpenSTAAD As Object
'Get the application object
objOpenSTAAD = GetObject(, "StaadPro.OpenSTAAD")
'Open the file
Dim strFileName As String
strFileName = "C:\\Pro01.std"
objOpenSTAAD.OpenSTAADFile(strFileName)
End Sub
在VC中尝试几种以下几种调用方法都提示E_NOINTERFACE错误,为什么?
#import "C:\\SPro2007\\OpenSTAAD\\OpenSTAADUI.tlb" no_namespace
//。。。。方法1。。。。。。。
CoInitialize(NULL);
IOpenSTAADUIPtr m_ui = NULL;
HRESULT hr = m_ui.GetActiveObject(__uuidof(OpenSTAAD));// hr为E_NOINTERFACE
CoUninitialize();
//。。。。方法2。。。。。。。
CoInitialize(NULL);
CLSID clsid;
CLSIDFromProgID(L"StaadPro.OpenSTAAD", &clsid);
IUnknown *pUnk = NULL;
IDispatch *pDisp = NULL;
IOpenSTAADUI *pOSUI = NULL;
hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
if(SUCCEEDED(hr))
{
hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp);// hr为S_OK,没问题
}
if(SUCCEEDED(hr))
{
hr = pDisp->QueryInterface(__uuidof(IOpenSTAADUI);,(void **)&pOSUI);hr为E_NOINTERFACE
}
CoUninitialize();
其中导入tlb文件生成的tlh文件关键部分如下所示
struct __declspec(uuid("eda9fa7f-efc9-4264-9513-39cf6e72604d"))
/* LIBID */ __OpenSTAADUI;
enum StrengthType;
struct __declspec(uuid("3f5b8055-31c6-446e-8bed-fee43e09d4cc"))
/* dispinterface */ IOpenSTAADUI;
struct /* coclass */ OpenSTAAD;
struct __declspec(uuid("c052fed9-a2d6-42e3-a271-2c6fb8461711"))
/* dispinterface */ IOSGeometryUI;
struct /* coclass */ OSGeometryUI;
//
// Smart pointer typedef declarations
//
_COM_SMARTPTR_TYPEDEF(IOpenSTAADUI, __uuidof(IOpenSTAADUI));
_COM_SMARTPTR_TYPEDEF(IOSGeometryUI, __uuidof(IOSGeometryUI));