无法创建CComPtr的实例

时间:2017-10-25 15:32:36

标签: c++ visual-studio com visual-studio-2017 atl

我正在尝试使用一个简单的c ++进程COM对象SimpleObject,我正在使用Visual Studio Community 2017(15.3.5)和Windows 10编写控制台应用程序,但我无法初始化我的对象。我正在使用SimpleObject的ATL项目,简单的对象线程设置为Apartment,Aggregation设置为yes,我的界面是自定义的,并且启用了Free-threaded marshaller。

我已经在操作系统上注册了SimpleObject dll和exe,但是当我运行我的app打印到控制台时指示对象已成功初始化。调试显示My CComPtr为空并给出错误:

  

0x80080005:服务器执行失败。

我的控制台应用程序如下所示:

#include "stdafx.h"
#include <atlbase.h>

#include "..\TestCOM\TestCOM_i.h"
#include "..\TestCOM\TestCOM_i.c"

int main(){
    HRESULT hr = CoInitialize(NULL);

    CComPTR<ISimpleObject> testCom;
    hr = testCom.CoCreateInstance(CLSID_SimpleObject, NULL, CLSCTX_ALL);

    if(!FAILED(hr)){
        printf("Created!\n");
        testCom.Release();
    }

    CoUninitialize();

    return 0;
}

我的.idl文件如下所示:

import "oaidl.idl";
import "ocidl.idl";

[
    object,
    uuid(02f8b163-c674-4f9a-9b8d-d61bb5aca632),
    pointer_default(unique)
]
interface ISimpleObject : IUnknown
{
    HRESULT Hello();
};
[
    uid(ec13d56e-de4f-4d1d-aed0-0f219d95effc),
    version(1.0),
]
library TestCOMLib
{

    [
      uid(74f0adfcc-23ad-47c79a59-591dca8117a1)
    ]
    coclass SimpleObject
    {
        [default] interface ISImpleObject;
    };
};

import"shobjidl.idl";
import"shobjidl.idl";
import"shobjidl.idl";

我添加的唯一内容是HRESULT Hello();

我的SimpleObject.h看起来像这样:

#pragma once
#include "resource.h"
#include "TestCom_i.h"    
using namespace ATL;

class ATL_NO_VTABLE CSimpleObject :
      public CComObjectRootEx<CComSingleThreadModel>,
      public CComCoClass<CSimpleObject, &CSimpleObject>,
      public ISImpleObject
{
public:
   CSimpleObject()
   {
       m_pkUnkMarshaler = NULL:
   }

DECLARE_REGISTRY_RESOURCEID(106)

BEGIN_COM_MAP(CSImpleObject)
    COM_INTERFACE_ENTRY(ISimpleObject)
    COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pkUnkMarshaler .p)
END_COM_MAP()

   DECLARE_PROTECT_FINAL_CONSTRUCT()
   DECLARE_GET_CONTROLLING_UNKNOWN()

   HRESULT FinalConstruct()
   {
       return COCreateFreeThreadedMarshaler(
           GerControllingUnknown(), &m_pkUnkMarshaler .p);
   }

   void FinalRelease()
   {
       m_pkUnkMarshaler.Release();
   }

   CComPtr<IUnkown> m_pkUnkMarshaler;

public:
    STDMETHOD(Hello)() {retrun S_OK; }
};
OBJECT_ENTRY_AUTO(__uuidof(SimpleObject), CSimpleObject)

我添加的唯一内容是STDMETHOD(Hello)() {retrun S_OK; }

我错过了什么?我的控制台应用程序基于this example from Microsoft,除了TestCom.idlSimpleObject.h中添加的两行外,Visual Studio和编译器都会自动生成所有内容。

0 个答案:

没有答案