Exception_Access_Violation mit Jacob - Variant-Parameter nicht i.O.?

Ganon

Grünschnabel
Hallo zusammen,

ich bin neu hier und hoffe, dass ihr mir helfen könnt. Ich habe hier auf der Arbeit ein halbfertiges Programm von meinem Vorgänger übernommen, dass die Java-COM-Bridge Jacob nutzt, um ein anderes Programm anzusprechen (KSPhonet.ocx bzw. FuzzyDupes, falls das jemandem was sagt). Die wichtigen Methoden, die u.a. ein VariantArray als Eingabeparameter nehmen, verursachen beim Aufruf leider immer einen Fehler:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d8fdd45, pid=752, tid=5096
#
# JRE version: 6.0_21-b06
# Java VM: Java HotSpot(TM) Client VM (17.0-b16 mixed mode, sharing windows-x86 )
# Problematic frame:
# V [jvm.dll+0xfdd45]
#

Und so weiter. ich kann auch das ganze Ding posten, wenn gewünscht, aber ich weiß nicht, ob das was bringt. Jedenfalls hab ich keine Ahnung, was man da machen könnte. Selbst den Entwickler von FuzzyDupes habe ich schon angeschrieben, der meinte, er kennt sich mit Jacob nicht aus, aber ich solle mal das Eingabe-Array (OleVariantArray) überprüfen. Ich dachte mir, vielleicht ist der nicht ganz in Ordnung? Es muss ein zweidimensionaler Array sein, der folgendermaßen erstellt wird:
Code:
	public static Variant create2DimVariant(String[][] values) {
		
		int sizeX = values.length;
		int sizeY = values[0].length;
		
		int[] lbounds = new int[2];
		int[] sizes = new int[2];
		sizes[0] = sizeX;
		sizes[1] = sizeY;
		
		SafeArray records = new SafeArray(Variant.VariantVariant, lbounds, sizes);
		
		for (int i=0; i<values.length; i++) {
			for (int j=0; j<values[i].length; j++) {
				records.setString(i, j, values[i][j]);
			}
		}
		
		Variant v = new Variant();
		v.putSafeArray(records);
		
		return v;
	}
Kann mir vielleicht jemand sagen, ob das so in Ordnung sein müsste, oder wo der Fehler liegen könnte?

Vielen Dank!

PS: Die Doku zu KSPhonet findet ihr hier: http://www.kroll-software.de/products/fuzzydupescom/KSPhonetDoc.html
Probleme hatte ich mit den metodes fuzzyMatch() und dupeSearch(). Methoden ohne Parameter (reset()) gehen einwandfrei, auch die license()-Methode, die zwei Strings in Variant-Form übergeben bekommt.
 
Hallo nochmal,

schade, dass mir anscheinend niemand helfen kann. :(
Das Problem ist nämlich immer noch nicht gelöst und mein Chef sitzt mir langsam im Nacken (hatte zwischendurch auch andere Sachen gemacht, aber jetzt ist es wieder akut).
Zumindest glaube ich mittlerweile nicht mehr, dass es an Jacob liegt. Habe es alternativ auch mit COM4j probiert, aber das Ergebnis ist dasselbe. Ich poste hier mal den Stacktrace aus der Logdatei, zumindest die Spitze des Stecks. Die Methoden werden hier übrigens aus einer Swing-Oberfläche heruas aufgerufen, aber das hat keinen Einfluss, habe es auch anders getestet.

JACOB-Variante:
Code:
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  com.jacob.com.Dispatch.invokev(Lcom/jacob/com/Dispatch;Ljava/lang/String;III[Lcom/jacob/com/Variant;[I)Lcom/jacob/com/Variant;+0
j  com.jacob.com.Dispatch.invokev(Lcom/jacob/com/Dispatch;Ljava/lang/String;I[Lcom/jacob/com/Variant;[I)Lcom/jacob/com/Variant;+14
j  com.jacob.com.Dispatch.callN(Lcom/jacob/com/Dispatch;Ljava/lang/String;[Ljava/lang/Object;)Lcom/jacob/com/Variant;+15
j  com.jacob.activeX.ActiveXComponent.invoke(Ljava/lang/String;[Lcom/jacob/com/Variant;)Lcom/jacob/com/Variant;+3
j  crm.util.dedup.FuzzyDupes.dupeSearch(Lcom/jacob/com/Variant;IDDLjava/lang/String;Z)Lcom/jacob/com/Variant;+105
j  crm.util.dedup.FuzzyDupesWrapper.dupeSearch([[Ljava/lang/String;IDDLjava/lang/String;Z)[[Ljava/lang/String;+20
j  crm.util.dedup.FuzzyDupesWrapper.dupeSearch([[Ljava/lang/String;[Ljava/lang/String;IDDLjava/lang/String;Z)[[Ljava/lang/String;+46
j  crm.util.dedup.FuzzyDupesGui$4.actionPerformed(Ljava/awt/event/ActionEvent;)V+124
j  javax.swing.AbstractButton.fireActionPerformed(Ljava/awt/event/ActionEvent;)V+84
...
j  java.awt.EventDispatchThread.run()V+9
v  ~StubRoutines::call_stub

com4j-Variante:
Code:
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  com4j.Native.invokeDispatch(JII[Ljava/lang/Object;)Lcom4j/Variant;+0
j  com4j.DispatchComMethod.invoke(J[Ljava/lang/Object;)Ljava/lang/Object;+15
j  com4j.Wrapper$InvocationThunk.call()Ljava/lang/Object;+15
j  com4j.Task.invoke()V+17
j  com4j.ComThread.run0()V+42
j  com4j.ComThread.run()V+27
v  ~StubRoutines::call_stub

Ich hab schon diverse Fehlerquellen außerhalb vom Code gesucht, wurde aber nicht fündig. Die Komponente ist ordentlich in Windows registriert, der Classpath scheint auch zu stimmen. Sonst würde ja gar nichts gehen und nicht nur diese Methoden nicht, oder? Was kann da nur los sein...? :confused:
 
Moin,

hmm, Du schießt Dir hier ja die gesamte VM ab ...
EXCEPTION_ACCESS_VIOLATION deutet stark darauf hin, dass Du irgendwo Speicher kaputt schriebst !

Ob dies durch den geposteten Code verursacht werden kann, vermag ich so aus dem Stand nicht zu beurteilen.

Was mir daran nur auffällt:
Java:
... String[][] values)  // <== Übergabe ist ein zweidimensionales Array
{
        int sizeX = values.length;
        int sizeY = values[0].length;  // <== dieser Zugriff dürfte so nicht gehen, oder ?

Gruß
Klaus
 
Erst einmal danke für deine Antwort. Leider bin ich trotzdem noch ratlos.

int sizeY = values[0].length; // <== dieser Zugriff dürfte so nicht gehen, oder ?
Hm, warum denn nicht? An der Stelle sehe ich keine Probleme. Das ist einfach die Anzahl der Spalten der Tabelle, die in den zweidimensialen Array gespeichert wurde. Ich krieg aus dieser Methode auch einen Variant raus, der die Daten enthält - jedenfalls sieht das für mich alles korrekt aus, ich kann da leider auch im Debug-Modus keine weiteren Eigenschaften auslesen.
Aufgerufen wird die Methode der Komponente dann hier:

Code:
	Variant dupeSearch(Variant varArray, int idColumnIndex, double threshold, 
			double clusterThreshold, String returnResults, 
			boolean showProgress) {
		
		reset();
		String methodName = "DupeSearch";
		
		Variant[] args = new Variant[7];
		
		args[0] = varArray;
		args[1] = new Variant(idColumnIndex);
		args[2] = new Variant(threshold);
		args[3] = new Variant(clusterThreshold);
		args[4] = null;
		args[5] = new Variant(returnResults);
		args[6] = new Variant(showProgress);
		
		System.out.println("Starting fuzzy dupes core");
        Variant result = fuzzyDupes.invoke(methodName, args);
        System.out.println("Finished fuzzy dupes core");
        
		return result;
	
	}
Der null-Parameter ist laut Doku: "Options: Reserved, not currently used. (default = "")". Hab da auch versucht, stattdessen einen leeren Variant zu übergeben, bzw. einen, der einen leeren String enthält, aber das nimmt er nicht an (ComFailException: Typkonflikt). Also, die Parameter sollten alle stimmen. Liegt es also irgendwie am System?

Ich hab übrigens testweise mal eine bei der Komponente mitgelieferte MS-Access-Demo auf meine Daten angepasst, das läuft. Nur leider nicht mi Java.
 
Also mit dem oben erwähnten Code kann es keine Probleme geben, da:

Java:
int[][][] array=new int[6][7][8];

array.length;        // return = 6 für die erste Dimension

array[].length;     // return = 7 für die zweite Dimension

array[][].length;  // return = 8 für die dritteDimension

Usw führt sich das fort.
Aber hab leider auch keinen Ansatz für dein Problem
 
Zurück