Coinitialize ex在JNI程序存根中的WMI调用中失败

时间:2011-06-02 12:53:39

标签: java-native-interface wmi

环境:

我有一个JNI程序,它由以下部分组成

  1. C ++:我在这里使用WMI来返回正在运行的进程详细信息。该程序类似于http://msdn.microsoft.com/en-us/library/aa390423(v=vs.85).aspx中的示例 我已经用JNI包装器包含了示例中的整个代码(我发送给程序的参数之一是Integer类型)。以下是该功能的签名
    JNIEXPORT jdouble JNICALL Java_handlemonitor_NativeSytem_getSystemDetails(JNIEnv * env,jclass cls,jint pId)
  2. 生成的DLL保存在JDK目录

    中的bin文件夹中
    1. Java:这里我只是调用dll中的函数并使用返回的值。 我还使用javah程序生成.h文件,并将其包含在C ++程序中。
    2. 问题:当我运行程序时,我在C ++程序中收到错误消息,其中CoInitializeEx失败,错误代码为0x80010106。

      以下是程序失败的行。

      hres = CoInitializeEx(0,COINIT_MULTITHREADED)。

      我尝试增加heapSize仍然继续失败。

      CoInitializeEx失败的任何特殊原因?

      提前致谢

1 个答案:

答案 0 :(得分:3)

错误0x80010106表示“HRESULT - 0x80010106 - 设置后无法更改线程模式。”

问题基本上是线程只能初始化其COM模式(和单元类型,STA / MTA)一次。设置后,如果尝试使用其他值重新初始化,则会出现此错误。

这个错误经常发生的是,其他一些第三方代码会导致COM在代码执行之前被初始化。如果是这种情况,那么您有几个选择:

1)尝试找到一种方法让您的代码先执行,这样您就可以自己设置COM单元类型。这可能很棘手,如果第三方代码需要STA

,可能会导致副作用

2)将您的代码放在自己的线程上,您可以在其中明确设置公寓类型

如果您实际上不关心公寓类型,那么您只需将对CoInitializeEx的调用更改为使用COINIT_APARTMENTTHREADED(STA)而不是COINIT_MULTITHREADED(MTA)。

希望有所帮助,

约翰