gpt4 book ai didi

c++ - 使用 ATL 将方法参数作为接口(interface)编译 dll,但将它们作为组件类获取

转载 作者:行者123 更新时间:2023-11-28 06:18:28 24 4
gpt4 key购买 nike

我正在使用 C++ ATL 库。 IDL 文件中的方法是使用 IQTAction 参数声明的,但是当我在 .NET 中使用此类型库时,我得到的方法参数类型为 QTAction NOT IQTAction:

namespace COMTest3Lib
{
[ClassInterface(0)]
[Guid("C6DD8D8E-8375-4CA6-8534-007776D96215")]
[TypeLibType(2)]
public class QTTestClass : IQTTest, QTTest
{
public QTTestClass();
public virtual void GetActiveAction(out QTAction pActionOut);
public virtual void RunAction(QTAction pActionIn);
}
}

namespace COMTest3Lib
{
[CoClass(typeof(QTActionClass))]
[Guid("FBCC87D9-4E5C-40D2-853F-E8548E625C5B")]
public interface QTAction : IQTAction
{
}
}

这是为什么呢?我如何让它使用接口(interface)而不是 coclass 作为参数的类型?

这是我的头文件和 IDL 文件:

using namespace ATL;

//QTTest.h
class ATL_NO_VTABLE CQTTest :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CQTTest, &CLSID_QTTest>,
public IDispatchImpl<IQTTest, &IID_IQTTest, &LIBID_COMTest3Lib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
CQTTest()
{
m_pActiveAction.CoCreateInstance(CLSID_QTAction); //construct an action;
}

DECLARE_REGISTRY_RESOURCEID(IDR_QTTEST)


BEGIN_COM_MAP(CQTTest)
COM_INTERFACE_ENTRY(IQTTest)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()

DECLARE_PROTECT_FINAL_CONSTRUCT()

HRESULT FinalConstruct()
{
return S_OK;
}

void FinalRelease()
{
::MessageBox(NULL, L"#################QTTest is being disposed", L"info", 0);
}

public:
STDMETHOD(GetActiveAction)(/*out*/IQTAction** pActionOut);
STDMETHOD(RunAction)(/*in*/IQTAction* pActionIn);

private:
CComPtr<IQTAction> m_pActiveAction;
};

OBJECT_ENTRY_AUTO(__uuidof(QTTest), CQTTest)

IDL 文件:

import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(FBCC87D9-4E5C-40D2-853F-E8548E625C5B),
pointer_default(unique)
]
interface IQTAction : IDispatch{
[helpstring("method Run")] HRESULT Run(void);
};
[
object,
uuid(19F205D2-1D1C-4DB7-A731-498665CC297F),
version(1.0)
]
interface IQTTest : IDispatch{
[helpstring("method GetActiveAction")] HRESULT GetActiveAction([out] IQTAction** pActionOut);
//[helpstring("method Run")] HRESULT Run(void);
[helpstring("Run a specific action")] HRESULT RunAction([in] IQTAction* pActionIn);
};
[
uuid(0E651E25-832E-4410-9A9E-F8CD8574F4D8),
]
library COMTest3Lib
{
importlib("stdole2.tlb");
[
uuid(C6DD8D8E-8375-4CA6-8534-007776D96215)
]
coclass QTTest
{
[default] interface IQTTest;
};
[
uuid(72D899CC-7722-4260-A441-3D1225132019)
]
coclass QTAction
{
[default] interface IQTAction;
};
};

最佳答案

据我所知,当类型库导入器发现在同一类型库中只有一个 coclass 实现该接口(interface)作为默认接口(interface)时,它会使用 coclass interface 而不是实际接口(interface),并且没有办法阻止它这样做。

但是,请注意QTTestIQTTest 都是接口(interface),具有相同的Guid 和方法。但是 QTTest 有一个额外的属性,CoClassAttribute(QTTestClass),它允许微软的 C# 编译器将 new QTTest() 编译成 new QTTestClass ()

tlbimp.exe 的这种杂耍让 VB6 程序员感到宾至如归,但对于 C++ 开发人员来说却很奇怪。在您的情况下,它仅意味着在两个其他方面等效的接口(interface)类型之间进行转换。

关于c++ - 使用 ATL 将方法参数作为接口(interface)编译 dll,但将它们作为组件类获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29782720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com