Parameterübergabe aus OOB an DLL Funktionen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

andi.martin
Beiträge: 3
Registriert: So, 14.01.2007 22:44

Parameterübergabe aus OOB an DLL Funktionen

Beitrag von andi.martin »

Ich versuche nun schon eine ganze Weile dahinter zu kommen, wie man komplexe Datenstrukturen an DLL Funktionen übergeben kann...
Möglicherweise hat ja einer von Euch schon Erfahrungen damit gemacht.

Folgendes Problem:
Ich habe eine selbst erstellte DLL-Funktion (in C programmiert, kein AddIn), der als Parameter ein großer Datenbereich aus einer Tabelle übergeben wird. Diese DLL ist unter Excel bereits erfolgreich im Einsatz. Der Datenaustausch erfolgt hier allerdings über die Zwischenablage, dieser Mechanismus funktioniert mit OOo aber leider nicht...
Ich möchte der Funktion einen Zellbereich als Array übergeben (LoL Array per getDataArray aus dem entsprechenden Sheet gelesen).
Wo kann ich nachlesen, in welchem Datenformat diese übergeben werden?
Ich habe ein paar Experimente gemacht und stoße dabei auf viele Ungereimtheiten. Ein SAFEARRAY scheint es nicht zu sein. Nehme ich ein VARIANT an stimmt VT_TYPE nicht (0x5460)...
Es ist mir auch nicht möglich einen definierten Variant als Referenz zu übergeben:
Deklaration der DLL-Funktion:

Code: Alles auswählen

Declare Sub MyFunc Lib "MyDLL" (ByRef aVariant as Variant)

Sub DLL_Test
  Dim aVariant as Variant
  aVariant = 77
  MyFunc(aVariant)
End Sub
Die DLL bekommt zwar eine Referenz, jedoch nicht auf ein VARIANT, sondern auf den Integerwert...

Wie muss ich die Declare Anweisung ausformulieren und wie komme ich unter C an meine Daten (LoL Array aus .getDataArray()) heran. Bzw. konkret: Wie wird das Array übergeben?

Vielen Dank für Eure Unterstützung,
Gruß, Andreas
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Andreas,

hmm, ohne dass ich Erfahrungen mit deinem speziellen Problem habe. Nur:

Dein kleines Codebeispiel erzeugt kein Array - das bedeutet, die "77" als Integer ist korrekt.
Um ein Array zu erhalten, müsste das wie folgt lauten:

Code: Alles auswählen

Sub DLL_Test
  Dim aVariant(0)
  aVariant(0) = 77
  MyFunc(aVariant)
End Sub
Jetzt hättest du mit aVaraint(0) ein Array mit einem Element erzeugt (Dimension), wobei der Typ des Elementes "Variant" ist. Diesem weist du dann die 77 zu, dadurch wird es ein Integer.
Um zunächst ein Array überhaupt zu erzeugen, reicht

Code: Alles auswählen

dim aVariant()
Das ist aber jetzt noch nicht dimensioniert, du kanst es also direkt unter Basich noch nicht ansprechenen. Jetzt gibt es zwei Möglichkeiten:
Entweder direkt über eine Funktion füllen, die auch die Größendimension mitteilt , z.B.

Code: Alles auswählen

aVaraint = array(77, 66, 55, 44, 33)  'Array mit 5 Elemente)
oder das Array zunächst dimensionieren, dann füllen:

Code: Alles auswählen

redim aVaraint(4)  'das Array hat jetzt 5 Elemente
aVariant(0) = 77    'erste Element gefüllt
Vielleicht hiolft dir das ja weiter :-)

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
andi.martin
Beiträge: 3
Registriert: So, 14.01.2007 22:44

Beitrag von andi.martin »

Hi Thomas,

danke für die prompte Antwort.
Das war auch eigentlich nur als kleines Beispiel gedacht, aus dem deutlich wird, dass OOo kein Variant übergibt, obwohl ich es explizit angebe: Zum einen in der Deklaration der externen Funktion (MyFunc) zum anderen habe ich die übergebene Variable (aVariant) ebenfalls als Variant deklariert. Übergeben wird jedoch ein (int*).

Wie gesagt, sollte nur ein Beispiel sein. Viel mehr interessiert mich, wie OOo Arrays an externe Funktionen übergibt.

Eine weiterer Lösungsansatz wäre ein AddIn zu schreiben. Hier kann ich den Parametertyp festlegen (CELLARRAY). Die Funktion kann ich dann aber nur mit dem Service com.sun.star.sheet.FunctionAccess aufrufen.
Alles etwas holperig, zudem muss die DLL dann im Systemordner (für Excel-Funktionalität) _und_ als AddIn installieren.
Viel eleganter ist ein direkter Auftruf der DLL, ... wenn ich nur wüsste wie...

Gruß,
Andreas
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Andreas,

ok, Missverständnis. Allerdings gibt es in OOo den Typ "Variant" eigentlich nicht. Der wird nur benutzt, wenn nichts anderes deklariert wurde. Ob du also

Code: Alles auswählen

dim v as varaint
oder nur

Code: Alles auswählen

dim v

schreibst, bleibt egal - im zweiten Fall wir v intern als Variant gefüht - bis du eben etwas zuweist, dann erhält die Variable den Typ des zugewiesenen Inhalts - in deinem Fall also Integer. Der Typ kann auch wieder wechseln - wenn du später also z.B. einen Text zuweist, wird der Typ eben String.

Also eigentlich müsste das mit dem Array genauso gehen, allerdings weiss ich natürlich nicht, ob du in deiner DDL Umgebung den Array genauso auflösen kannst - das dürfte wohl OOo spezifisch geregelt sein.

Also, sorry, da kann ich dir direkt nicht weiterhelfen.

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
andi.martin
Beiträge: 3
Registriert: So, 14.01.2007 22:44

Beitrag von andi.martin »

Aha. Das klingt einleuchtend.
Danke erst mal für den Tipp. Schade, dass Du mir mit den Arrays nicht weiterhelfen konntest...

Gruß,
Andreas
Antworten