1

我制作了一个从 geovision SDK 导入“.ocx”文件的 win32 控制台应用程序。我在生成的“.tli”和“.tlh”标头中找到了 COM 组件的正确 CLSID 和接口 ID,并且一切正常,直到我调用任何方法(例如在下面的代码中的 Login2)。然后 _com_exception 发生,它没有提供关于到底发生了什么的详细信息。

谁能给我一个提示我下一步应该做什么或我应该在哪里寻找解决方案?我花了一个多星期才达到在控制台应用程序中使用 COM 组件的地步……我希望它可以做到。

#include "stdafx.h"
#include "stdio.h"

#import "C:\Windows\GeoOCX\SinglePlayer\20121003\GVSinglePlayer.ocx" \
        named_guids no_namespace no_smart_pointers 

int _tmain(int argc, _TCHAR* argv[])
{
    try
    {
        CoInitialize(NULL);
        _DGVSinglePlayer* pSP = 0;
        HRESULT hr = CoCreateInstance(CLSID_GVSinglePlayer  ,NULL, CLSCTX_INPROC_SERVER,DIID__DGVSinglePlayer,reinterpret_cast  <void**>(&pSP));

        _bstr_t lpIPAddress("11.11.11.11");
        long iPort=10000;
        _bstr_t lpUserID("abcde");
        _bstr_t lpPassword("password");

        if ( SUCCEEDED ( hr ) )
        {
            hr = pSP->Login2(lpIPAddress,iPort,lpUserID,lpPassword );
            if ( SUCCEEDED ( hr ) )
            {
                printf("Cool");
            }
        }else
        {
        }
        pSP->Release();
        CoUninitialize();

    } catch (_com_error& e)
    {
        char buf[80];
        sprintf(buf, "Error: %S",e.Description());
        printf("%s\n",buf);
    }

    return 0;
}

由于 e.Description() 不打印任何信息,因此我附上了有关错误的视觉信息。

错误信息

4

1 回答 1

2

许多 ActiveX 控件都希望被适当地托管(这意味着,宿主实现IOleClientSite和相关的接口,并将指针传递给控件的IOleObject::SetClientSite)。此类控件为所有方法调用返回 E_UNEXPECTED,直到执行 OLE 激活舞蹈。

特别是,使用 MFC 开发的 ActiveX 控件通常以这种方式运行;该行为被纳入 MFC 框架。

我怀疑你的控制可能是其中之一。在这种情况下,您将无法在控制台应用程序中轻松使用它。您将需要一个使用实现 ActiveX 托管(MFC、ATL、WinForms;其他可能存在但我不熟悉的)框架的窗口应用程序。

于 2013-08-13T17:19:55.477 回答