1

给定这个接口:

struct ISomething
{
    virtual void __stdcall DoSomething() = 0;
};

DoSomething即使编译设置不同,应用程序能否安全地调用从 dll 或共享对象返回的具体对象?

(假设在非 Visual Studio 编译器上 d 为空。__stdcall#define

4

1 回答 1

0

实际上,当您说“对象”时,您指的是指向相关对象的指针吗?我假设是这样,因为由于纯虚拟 decls,您很可能无法创建 ISomething。

所以,如果你的意思是:

ISomething* pObj = SomeAPICallToGetAnObject();
pObj->DoSomething();

那么只要调用者和实现者都同意调用约定、打包结构化参数(如果有的话)等,它就会起作用。所述约定是基于声明的,并且由实现者+调用者按照合同强制执行。如果您未能将其定义为声明性合同的一部分,就会发生令人讨厌的事情。

这样的事情在实践中很常见吗?绝对地。我经常使用的所有 WIN32 api 代码的整个 COM 端肯定不会使用我经常使用的相同的各种编译设置进行编译。但是我从标头 decls 获得的合同确保我使用正确的约定来使其工作。事实上,这些声明确保我的编译符合使调用成功的要求。

希望我没有误解你的问题。

于 2012-12-19T17:30:51.197 回答