OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 11.01.2010, 14:11 Titel: VBA<->FB-DLL per disphelper |
|
|
Ich habe mal eine ungewöhnliche idee für den komfortablen Datenaustausch zwischen VB(A)-Projekten und einer FB-DLL:
+Der Disphelper kann VB-Komponenten ansprechen.
+Mit FB kann man DLLs erstellen die in VBA-Projekten eingebunden werden können.
-Der schnelle und komforable Datenaustausch zwischen FB-DLL und VB(A) ist hingegen nicht so einfach.
=Daraufhin dachte ich mir, dass man den disphelper dazu verwenden könnte Objekte eines VB(A)-Projektes an eine DLL zu übergeben und darin weiterzuarbeiten.
Vorteil: Schneller als VB(A) und halbwegs sicherer Code, weil die DLL im gegensatz zum VB(A)-Code kompiliert wird.
In meinem Fall ist das ein Excel-VBA-Projekt!
Dazu ist mir folgendes Code eingefallen:
FB-DLL (kompilat ablegen in "C:\Excel_dll\xldll.dll" ansonsten Pfad in dem Makro anpassen):
Code: |
'(muss kompiliert werden mit fbc -dll -export)
#define UNICODE
#INCLUDE ONCE "windows.bi"
#include once "disphelper\disphelper.bi"
EXTERN "windows-ms"
FUNCTION testen alias "testen" (byval sht as IDispatch ptr, rng as IDispatch ptr ) AS INTEGER EXPORT
Dim As Zstring Ptr txt = NULL
dhInitialize(TRUE)
dhToggleExceptions(FALSE)
dhGetValue("%s", @txt, rng, ".value")
MessageBox(0, "Hallo :" & *txt, "Dialogfenster", 0)
return 0
end function
END EXTERN
|
Excel-Makro:
Code: |
Private Declare Function testen Lib "C:\Excel_dll\xldll.dll" (ByRef Sht As Object, ByRef rng As Object) As Boolean
Sub testdll()
MsgBox testen(ThisWorkbook.Sheets(1), Range("A1"))
End Sub
|
In diesem beispiel soll einmal das object Sheets(1) von Thisworkbook und Range("A1") an die FB-DLL-Funktion übergeben werden.
Auf der DLL seite "empfängt" die DLL diese Parameter per IDispatch ptr.
Value von Range("A1") soll nun in einer Windows-Messagebox in der DLL ausgeben werden.. Es wäre natürlich nützlich, wenn man in "A1" des aktuellen Blattes in Excel was reinschreibt...
Wenn man nun die DLL mit den richtiger compiler-parametern kompiliert und das makro startet, wird mal leider mit einem Absturz von Excel belohnt ...
Weiss einer ob das grundsätzlich funktioniert, oder ob ich einen fehler gemacht habe?
bzw. anscheinend hab ich ja einen fehler gemacht XD .. sonst würd der nich abstürzen.. |
|