2012-05-11 14 views
8

के साथ काम करता है हम विंडोज 7 एंटरप्राइज़, एसपी 1, 64 बिट पर चल रहे हैं। हमने अपनी सभी मशीनों पर जावा 7 स्थापित किया है, जो निम्न समस्या का कारण बनता है:जावा 7: COM-API गुणवत्ता केंद्र (OTAClient.dll) के साथ काम नहीं करता है, लेकिन जावा 6

जब मेरा प्रोग्राम गुणवत्ता केंद्र से OpenTestArchitecture-API के साथ संवाद करने का प्रयास करता है तो यह ActiveX-घटक बनाने में विफल रहता है। मैं अपनी जावा-कॉम लाइब्रेरी के रूप में JACOB का उपयोग करता हूं। जेएसीओबी के नवीनतम संस्करण में अपग्रेड करने से कुछ भी नहीं बदलेगा। (32 बिट)

निम्न परीक्षण jdk1.6.0_24 (32 बिट) के साथ काम करता है लेकिन jdk1.7.0_04 के साथ विफल:

import java.io.File; 

import com.jacob.activeX.ActiveXComponent; 
import com.jacob.com.ComThread; 
import com.jacob.com.Dispatch; 
import com.jacob.com.LibraryLoader; 

public class JacobTest { 
    static { 
     File lib = new File("lib/" + LibraryLoader.getPreferredDLLName() + ".dll"); 
     System.setProperty(LibraryLoader.JACOB_DLL_PATH, lib.getAbsolutePath()); 

     System.out.println("JACOB_DLL_PATH = " + lib.getAbsolutePath()); 
     LibraryLoader.loadJacobLibrary(); 
    } 

    public static void main(String[] args) { 
     try { 
      // Excel: Works with jdk1.6.0_24 AND jdk1.7.0_04 
      System.out.println("new ActiveXComponent(\"Excel.Application\");"); 
      new ActiveXComponent("Excel.Application"); 

      // Quality Center OTAClient: Only works with jdk1.6.0_24 
      System.out.println("ActiveXComponent component = new ActiveXComponent(\"TDApiOle80.TDConnection\");"); 
      ActiveXComponent component = new ActiveXComponent("TDApiOle80.TDConnection"); 

      System.out.println("ComThread.InitSTA();"); 
      ComThread.InitSTA(); 

      System.out.println("Dispatch.call(component, \"InitConnectionEx\", \"http://intranet/qcbin\");"); 
      Dispatch.call(component, "InitConnectionEx", "http://intranet/qcbin"); 
     } 
     catch (Exception exception) { 
      exception.printStackTrace(); 
     } 
    } 
} 

jdk1.6.0_24 उत्पादन:

JACOB_DLL_PATH = C:\Development\Java\Test\JacobTest\lib\jacob-1.17-M2-x86.dll 

new ActiveXComponent("Excel.Application"); 
ActiveXComponent component = new ActiveXComponent("TDApiOle80.TDConnection"); 
ComThread.InitSTA(); 
Dispatch.call(component, "InitConnectionEx", "http://intranet/qcbin"); 

jdk1 .7.0_04 उत्पादन:

JACOB_DLL_PATH = C:\Development\Java\Test\JacobTest\lib\jacob-1.17-M2-x86.dll 

new ActiveXComponent("Excel.Application"); 
ActiveXComponent component = new ActiveXComponent("TDApiOle80.TDConnection"); 
com.jacob.com.ComFailException: Invalid access to memory location. 
    at com.jacob.com.Dispatch.createInstanceNative(Native Method) 
    at com.jacob.com.Dispatch.<init>(Dispatch.java:99) 
    at com.jacob.activeX.ActiveXComponent.<init>(ActiveXComponent.java:58) 
    at JacobTest.main(JacobTest.java:26) 

मूल ComFailException-संदेश है "के सह-निर्माण नहीं कर सकते वस्तु" लेकिन मैं j में निम्नलिखित कोड संपादित कर लिया है acob Dispatch.cpp: (मैं CoCreateInstance स्पर्श नहीं किया था, मैं सिर्फ पता है कि HRESULT चाहता था)

// standard creation 
    hr = CoCreateInstance(clsid,NULL,CLSCTX_LOCAL_SERVER|CLSCTX_INPROC_SERVER,IID_IUnknown, (void **)&punk); 
    if (!SUCCEEDED(hr)) { 
    if (hr == REGDB_E_CLASSNOTREG) 
     ThrowComFail(env, "Can't co-create object: REGDB_E_CLASSNOTREG", hr); 
    if (hr == CLASS_E_NOAGGREGATION) 
     ThrowComFail(env, "Can't co-create object: CLASS_E_NOAGGREGATION", hr); 
    if (hr == E_NOINTERFACE) 
     ThrowComFail(env, "Can't co-create object: E_NOINTERFACE", hr); 
    if (hr == E_POINTER) 
     ThrowComFail(env, "Can't co-create object: E_POINTER", hr); 

    _com_error error(hr); 
    LPCTSTR errorText = error.ErrorMessage(); 

    ThrowComFail(env, errorText, hr); 
    return; 
    } 

किसी को भी एक सुराग क्या समस्या हो सकती है है? केवल अंतर यह है कि मैं जावा 6 और जावा 7 रनटाइम के बीच स्विच करता हूं।

आपकी मदद के लिए बहुत बहुत धन्यवाद!

पीएस: एक्सेल दोनों संस्करणों के साथ काम करता है और com4j-Library पर स्विच कुछ भी नहीं बदलता है। (मैं एक com4j टेस्ट मैचों की है, लेकिन मैं इसे पोस्ट नहीं किया क्योंकि मैं पहले से ही पर्याप्त कोड पोस्ट किया है)

संपादित करें: ही परीक्षण Windows XP, SP3 और जावा 7.

+1

यह स्पष्ट नहीं है कि मूल जैकोब कोड से प्राप्त अपवाद एक "मेमोरी एक्सेस उल्लंघन" या HRESULT है या नहीं? –

+0

और यदि आप स्पष्ट कर सकते हैं कि क्या समान व्यवहार com4j और जावा 7 का उपयोग करता है। –

+0

मूल जैकब-अपवाद "वस्तु को सह-निर्माण नहीं कर सकता" है। क्योंकि यह बहुत कुछ नहीं बताता है कि मैंने यह पता लगाने की कोशिश की कि मूल भाग में CoCreateInstance फ़ंक्शन का नतीजा क्या था। इस विधि से त्रुटि संदेश "स्मृति स्थान तक अवैध पहुंच" है। जब मैं याकूब के बजाय com4j का उपयोग करता हूं तो मुझे एक ही परिणाम मिलते हैं: "एक्सेल। एप्लिकेशन" और "TDApiOle80.TDConnection" जावा 7 के साथ काम करता है, जावा 7 "एक्सेल। एप्लीकेशन" काम करता है लेकिन "TDApiOle80.TDConnection" नहीं करता है। – r3zn1k

उत्तर

2

याकूब के साथ काम करता डीएलएल जेआरई से jvm.dll (विधियों और संरचनाओं) से जुड़ा हुआ है। तो मेरा अनुमान है कि जावा 7 जेआरई में ठीक से लोड करने के लिए जावा 7 के साथ स्रोतों से जैकब डीएलएल को संकलित किया जाना चाहिए।

आप not alone रहे हैं, लेकिन मुझे लगता है कि बहुत कम लोग पहले से ही जावा 7 ...

चल रहे हैं

अद्यतन: मैं तुम्हें Process Monitor के साथ पहले की जांच अगर कोई पुस्तकालय हैं या प्रणाली अपने जावा प्रक्रिया में नाकाम रहने के कॉल का प्रस्ताव प्रक्रिया को डीबगर में चलाने से पहले ... शायद ओपनजेडीके 7 भी कोशिश करने का विकल्प हो सकता है, कम से कम समस्या का निदान करने के लिए इसे डीबग करना आसान होना चाहिए।

+0

मैंने पहले ही जावा 7 के साथ जैकोब बनाया है, लेकिन इससे कुछ भी नहीं बदला ... वैसे भी, आपके उत्तर के लिए धन्यवाद! – r3zn1k

संबंधित मुद्दे