两个简单的COM IDL语法问题:是否有方法指定线程模型,以及是否需要void来表示;没有争论;?

两个简单的COM IDL语法问题:是否有方法指定线程模型,以及是否需要void来表示;没有争论;?,com,idl,midl,Com,Idl,Midl,两个简单的COM IDL文件问题,即使搜索MSDN和通用互联网,我似乎也找不到答案: 是否有一个接口属性可以让我指定我的接口仅由STA对象实现,或者这只是我的文档的一个细节?我已经有了[object,local],我认为这对于非远程(进程中)COM对象是正确的 我是否需要在方法声明(如C中)的括号中void,以不指定任何参数?MSDN对此不一致;头文件也是如此。我个人对这个接口的实现将使用C语言 谢谢。您正在谈论要为COM组件指定的线程模型。不,你不能把它放在IDL中,它太重要了。客户端不必使用

两个简单的COM IDL文件问题,即使搜索MSDN和通用互联网,我似乎也找不到答案:

  • 是否有一个接口属性可以让我指定我的接口仅由STA对象实现,或者这只是我的文档的一个细节?我已经有了
    [object,local]
    ,我认为这对于非远程(进程中)COM对象是正确的

  • 我是否需要在方法声明(如C中)的括号中
    void
    ,以不指定任何参数?MSDN对此不一致;头文件也是如此。我个人对这个接口的实现将使用C语言

  • 谢谢。

    您正在谈论要为COM组件指定的线程模型。不,你不能把它放在IDL中,它太重要了。客户端不必使用IDL,例如,像Javascript这样的脚本语言永远不会使用。它必须位于注册表中,位于组件的CLSID项中。您希望ThreadingModel=“公寓”请求客户端提供STA线程。如果它丢失了,那么COM默认情况下会假定它丢失了

    请记住,这并不强迫客户机程序员提供一个。如果他出于某种原因支持MTA,那么COM将提供STA线程,使您的组件成为安全的家。如果您的代理使其太慢而无法使用,那么您确实需要文档


    IDL中不需要
    HRESULT方法(void)
    ,使用
    HRESULT方法()
    就足够了。Midl.exe不在乎你使用什么语言。

    COM充满了未指定的东西,因为在COM的早期,常见的做法是这样的。。。我认为使用
    void
    没有什么害处,我也不知道接口属性能实现什么。(如果其他人想要实现您的界面,那么这对他们来说很好)。支持的线程模型是类的属性,而不是特定的接口。啊,“类的属性”是有意义的。谢谢你的两个答案!在我使用的设置中,线程模型是在一个.cpp文件中指定的(实际上是类似ATL的基的构造函数参数),并且自注册码引用它。我猜MSVC也做了类似的事情。