我用JNI去调用一个DLL,这个DLL使用了COM。我在DllMain里初始化COM:BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
::CoInitialize(NULL);
break; case DLL_PROCESS_DETACH: ::CoUninitialize();
break;
}
return TRUE;
}在一个DLL的导出函数connect里使用COM:JNIEXPORT void JNICALL Java_opcjni_connect(JNIEnv *e, jobject obj)
{
//::CoInitialize(NULL); //问题来了:如果注释这句
HRESULT hr=::CoCreateInstance(cls,NULL,CLSCTX_ALL,IID_IServer,(void**)&pServer);
_com_error err(hr);
::MessageBox(NULL,err.ErrorMessage(),"CoInitialize",0); //则报错:COM没有初始化
}而我用VC++写的程序去调同一个DLL,则没有问题。想了几天,一直没有解决这个问题,请教大家到底是哪有问题呢?
解决方案 »
- java能编译不能运行出现这样的错误
- 关于java使用commapi实现与单片机的串口通信问题
- 求Applet小程序中的完全安全策略?
- 求购 J2ME 短信加密程序原代码
- 高分求解,在JMX的Relation service中,一个Mbean只能充当一个role吗?
- JAVA的朋友们,有好的书籍么,需要好的书籍么里边请
- 怎么分别显示浮点数的整数部分和小书部分?
- 关于JAVA的出错信息的意思~
- 小弟kangta:一个调查多长时间考过scjp的问题!
- java程序中定义了的字符型如何转为整型
- s:iterator 里的s:select 下拉框没有显示全部
- 一个Thread sleep()的简单问题
用CoInitializeEx(COINIT_MULTITHREADED)可以初始化多线程的。
case DLL_PROCESS_ATTACH:
::CoInitializeEx(COINIT_MULTITHREADED);
break; case DLL_PROCESS_DETACH: ::CoUninitialize(); 或者,你在DllMain里对每个线程都初始化
case DLL_THREAD_ATTACH:
::CoInitialize(NULL);
break;
case DLL_THREAD_DETACH:
::CoUninitialize();
{
HRESULT hr=::CoCreateInstance(cls,NULL,CLSCTX_ALL,IID_IServer,(void**)&pServer);
} JNIEXPORT void JNICALL Java_opcjni_readAsync(JNIEnv *e, jobject obj)
{
IConnectionPoint *pCP=NULL;
IConnectionPointContainer *pCPC=NULL;
IDataRead *pIO=NULL; IUnknown *pUnk; pUnk->QueryInterface(IID_IConnectionPointContainer,(void**)&pCPC);
pCPC->FindConnectionPoint(IID_IDataReadCompleted,&pCP); IDataReadCompleted *pDRC=new CDataReadCompleted(e,obj);
DWORD dwC;
pCP->Advise(pDRC,&dwC);
hr=pIO->Read();
//::MessageBox(NULL,"1","caption",0); //如果加这句,则java程序可以正确立刻调 //用::OnDataReadComplete 的MessageBox,如不加, //则要到java程序关闭才会调用
}类CDataReadCompletedSTDMETHODIMP CDataReadCompleted ::OnDataReadComplete (float f)
{ char c[256];
sprintf(c,"this %f",f);
::MessageBox(NULL,c,"caption",0); return S_OK);
}
具体原因你要自己分析了。
你把MessageBox改成printf或System.out.println看看能否正确输出。