gpt4 book ai didi

c++ - 非托管 C++ 和 Delphi 之间的 COM 问题

转载 作者:搜寻专家 更新时间:2023-10-31 02:01:05 25 4
gpt4 key购买 nike

我在非托管 C++ 中有一个 DLL:

EditArticleManagerFactory.h:

class __declspec(dllexport) EditArticleManagerFactory : public NamedClassFactory<SCEditArticleManager>,
public SCBLEditArticle:ICOMEditArticleManagerFactory
{
public:
STDMETHODIMP CreateManager(BSTR bstrName, SCBLEditArticle::ICOMEditArticleManager** pEditArticleManager);

}


interface ICOMEditArticleManagerFactory : IUnknown
{
HRESULT CreateManager([in]BSTR bstrName, [out]ICOMEditArticleManager** pEditArticleManager);
}

EditArticleManagerFactory.cpp:

STDMETHODIMP EditArticleManagerFactory::CreateManager(BSTR bstrName,     SCBLEditArticle::ICOMEditArticleManager** pEditArticleManager)
{
manager = factory->createManager(bstrName);
return manager->QueryInterface(__uuidof(SCBLEditArticle::ICOMEditArticleManager), (void**)&pEditArticleManager);
}

我想从 Delphi 调用这个方法,它应该返回一个接口(interface)给创建的管理器。

德尔福:

function CreateManager(bstrName: wideString; pEditArticleManager: ICOMEditArticleManager): HResult; stdcall; external 'SCBLEditArticle.dll';

procedure CreateManager;
var
hr:HResult;
mCOMEditArticleManager: ICOMEditArticleManager;
begin
hr := CreateManager('MANAGER1', mCOMEditArticleManager);
end;

问题是当它到达末尾时我遇到了访问冲突;在这个 delphi 方法中。

你知道哪里出了问题吗?

谢谢,鲁弗斯

编辑:但是我正在使用一个宏来实现 Release 和

EditArticleManagerFactory.h : 

IMPLEMENT_UNKNOWN_NODELETE(EditArticleManagerFactory) BEGIN_INTERFACE_TABLE(EditArticleManagerFactory) IMPLEMENTS_INTERFACE(SCBLEditArticle::ICOMEditArticleManagerFactory) END_INTERFACE_TABLE()

Inttable.cpp:
define IMPLEMENT_UNKNOWN_NODELETE(ClassName) \

STDMETHODIMP QueryInterface(REFIID riid, void **ppv) \ { \ HRESULT hr = InterfaceTableQueryInterface(this, GetInterfaceTable##ClassName(), riid, ppv);\ __if_exists(InheritedQueryInterface##ClassName) { if ( FAILED(hr) ) hr = InheritedQueryInterface##ClassName(riid, ppv); } \ return hr; \ }\ STDMETHODIMP_(ULONG) AddRef(void) { return 2; } \ STDMETHODIMP_(ULONG) Release(void) { return 1; }

此外:当我从 Delphi 调试时,我在 UnsetExceptionHandler 中遇到访问冲突004046F7 3901 cmp [ecx],eax。也许这有助于诊断问题。

另外,如果我在我的 C++ 类之外声明了一个外部函数,并从 Delphi 调用它,我没有得到访问冲突,但也没有得到接口(interface)指针。

还有:如果我在 C++ 方法中什么都不做,我仍然会遇到 AccessViolation。

最佳答案

应该是

function  CreateManager(bstrName: wideString; OUT pEditArticleManager: ICOMEditArticleManager): HResult; stdcall; external 'SCBLEditArticle.dll';

注意“OUT”,您以某种方式删除了一个间接寻址。 (一个接口(interface)只有一个*,没有两个)

关于c++ - 非托管 C++ 和 Delphi 之间的 COM 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1124263/

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