我正在尝试使用一个简单的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.idl
和SimpleObject.h
中添加的两行外,Visual Studio和编译器都会自动生成所有内容。