com4j 呼叫控制元件後,解決無法釋放控制元件資源的方法
阿新 • • 發佈:2019-02-02
com4j的使用方法參見 http://blog.csdn.net/nieou/article/details/9952031
這裡討論下com4j釋放控制元件資源的問題。
com4j在Com4jObject介面中提供了一個dispose方法,用於釋放控制元件資源。但是實際使用中,呼叫dispose方法並沒有能夠成功釋放資源。
開始分析com4j的dll原始碼,在Java_com4j_Native_createInstance函式中發現控制元件介面建立部分似乎有些異常:
hr = CoCreateInstance(clsid,NULL,clsctx,__uuidof(IUnknown),(void**)&pUnk);
if(FAILED(hr)) {
error(env,__FILE__,__LINE__,hr,"CoCreateInstance failed");
return 0;
}
hr = OleRun(pUnk);
if(FAILED(hr)) {
error(env,__FILE__,__LINE__,hr,"OleRun failed");
return 0;
}
hr = pUnk->QueryInterface(iid,&p);
if(FAILED(hr)) {
error(env,__FILE__,__LINE__,hr,"QueryInterface failed");
return 0;
}
紅色部分程式碼不是通常建立介面會用到的,這裡我也不理解開發者的用意;不過在註釋該部分程式碼後,呼叫dispose方法就可以正確釋放資源了。