Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

C++ dll funktion an VBA in 32bit richtig übergeben

Forumthread: C++ dll funktion an VBA in 32bit richtig übergeben

C++ dll funktion an VBA in 32bit richtig übergeben
30.09.2024 18:16:22
zquizle
Guten Abend, ich arbeite aktuell an einer Anwendung, bei welcher ich ein Zeichen als String an einer dll datei gebe, welche in C++ geschrieben ist. Die Funktion nimmt das Zeichen, wandelt es um und gibt es an VBA wieder zurück. Da der Anwender eine dynamische Lib haben wird, nutze ich eine Zusatzfunktion, welche die deklarierte Funktion erstmal lädt. Das ganze funktioniert super in 64bit, leider bin ich absolut planlos und komme nicht weiter und sehe das Problem für den Code nicht in 32bit. In Office 2021 64bit funktioniert alles perfekt, in Office 2016 32bit findet er den Entry Point der dll datei nicht korrekt. Vielleicht hat einer von euch eine Lösung:

VBA:

Option Explicit


#If Win64 Then
Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare PtrSafe Function crypt64 Lib "crypt64.dll" (ByVal inputs As String) As String
#Else
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function crypt32 Lib "crypt32.dll" (ByVal inputs As String) As String
#End If

Sub dllcheck(inputs As String) 'prüft ob dll vorhanden ist
Dim dllPath As String, hModule As Long

#If Win64 Then
dllPath = ActiveSheet.Cells(1, 13).Value & "\Code\crypt64.dll"
#Else
dllPath = ActiveSheet.Cells(1, 13).Value & "\Code\crypt32.dll"
#End If

hModule = LoadLibrary(dllPath) 'falls der Ordner Code mit der crypt.dll nicht im selben Ordner/Pfad sind dann fehler
If hModule = 0 Then
MsgBox "Fehler! Stelle sicher, dass die .dll Dateien im Ordner Code gespeichert sind und dieser Ordner im selben Pfad mit der Excel Datei gespeichert ist!"
Exit Sub
End If
End Sub

Private Sub Workbook_Open()

Sheets("87613384684438375387").Unprotect Password:="chat"
Sheets("87613384684438375387").Cells(1, 13).Value = ThisWorkbook.path
Sheets("87613384684438375387").Protect Password:="chat"
dllcheck ""
'usw.......

End Sub


Die DLL Datei wurde zu 100% als x86 richtig kompiliert, hier habe ich bereits in dumpbin reingeschaut. Es ist sicher eine 32bit dll. Die Anwendung von "__stdcall" in 32bit habe ich berücksichtigt.

Anbei mal der Code der DLL Datei, geschrieben in C++:

#include "pch.h"

#include
#include

extern "C" __declspec(dllexport) BSTR __stdcall crypt32(BSTR input) {
wchar_t output[2];
wchar_t inputChar = input[0];


if (inputChar >= L'A' && inputChar = L'Z') {
inputChar = (inputChar - L'A' + 1) % 26 + L'A';
}
else if (inputChar >= L'a' && inputChar = L'z') {
inputChar = (inputChar - L'a' + 1) % 26 + L'a';
}

switch (inputChar) {
case L'A': output[0] = L'B'; break;
\\usw....
default: output[0] = inputChar; break;
}

output[1] = L'\0';

return SysAllocString(output);
}

extern "C" __declspec(dllexport) void FreeBSTR(BSTR bstr) {
SysFreeString(bstr);
}


Ich bin neu hier, daher nehmt es mir nicht übel falls ich etwas vergessen habe. Vielleicht hat einer von euch eine Idee, vielen Dank schonmal!

Gruß
Quizle
Anzeige

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: C++ dll funktion an VBA in 32bit richtig übergeben
30.09.2024 19:07:22
Volti
Hallo Quizle,
Zum Thema habe ich zunächst keine Idee, aber mal eine Frage.
Wofür brauchst du überhaupt die 32-Bit DLL?
Die PtrSafe Deklarationen gelten in VBA7 für 32 und 64 Bit bei Verwendung von LongPtr, was hier aber noch nicht einmal vorkommt.
Hast Du bei Deinem 2016 Rechner das mal mit der 64Bit-DLL ausprobiert?
Natürlich ohne den Schalter #If Win64.
Ggf. mit #If VBA7...

Gruß Karl-Heinz
Anzeige
AW: C++ dll funktion an VBA in 32bit richtig übergeben
30.09.2024 19:30:20
Onur
Wozu überhaupt eine externe Funktion? Wieso nicht gleich in VBA? Was genau soll denn die Funktion machen?
AW: C++ dll funktion an VBA in 32bit richtig übergeben
01.10.2024 09:31:39
Der Steuerfuzzi
Hallo,

Wie wurde denn die Funktion der DLL exportiert (unter welchem Namen)?

Lass doch mal dumpbin /EXPORTS oder evtl. dependency walker drüber laufen und schau nach, wie die Funktion exportiert wird. Dann ggf. ein Alias bei der Deklaration in VBA setzen

Grüße
Michael
Anzeige
AW: C++ dll funktion an VBA in 32bit richtig übergeben
01.10.2024 19:37:47
zquizle
Hallo Michael,

die Funktion wurde unter genau den Namen "crypt32.dll" exportiert. In dumpbin /EXPORTS habe ich geschaut und den Alias habe ich auch richtig angepasst. Leider löst das auch nicht mein Problem.

Gruß,
Quizle
AW: C++ dll funktion an VBA in 32bit richtig übergeben
01.10.2024 19:56:43
Volti
Hi,
Was mir gerade noch aufgefallen ist:
Handles wie hModule müssen oder sollten bei 64 Bit und 32 Bit LongPtr oder Longlong sein.
Also eine Unterscheidung im #IF Win64.... wäre sinnvoll.
Wundert mich, dass gerade 64 Bit bei Dir geht und 32 nicht.
Gruß Karl-Heinz
Anzeige
AW: C++ dll funktion an VBA in 32bit richtig übergeben
01.10.2024 20:06:38
volti
Hi,
so sollte es m.E. sein.
#If Win64 Then

Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As LongPtr
Private Declare PtrSafe Function crypt64 Lib "crypt64.dll" (ByVal inputs As String) As String
#Else
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function crypt32 Lib "crypt32.dll" (ByVal inputs As String) As String
#End If

Sub dllcheck(inputs As String) 'prüft ob dll vorhanden ist
Dim dllPath As String

#If Win64 Then
Dim hModule As LongPtr
dllPath = ActiveSheet.Cells(1, 13).Value & "\Code\crypt64.dll"
#Else
Dim hModule As Long
dllPath = ActiveSheet.Cells(1, 13).Value & "\Code\crypt32.dll"
#End If

hModule = LoadLibrary(dllPath) 'falls der Ordner Code mit der crypt.dll nicht im selben Ordner/Pfad sind dann fehler
If hModule = 0 Then
MsgBox "Fehler! Stelle sicher, dass die .dll Dateien im Ordner Code gespeichert sind und dieser Ordner im selben Pfad mit der Excel Datei gespeichert ist!"
Exit Sub
End If
End Sub


Gruß KH
Anzeige
AW: C++ dll funktion an VBA in 32bit richtig übergeben
01.10.2024 20:12:44
zquizle
Hi,
ja ich kann es mir irgendwie auch nicht erklären ich habe seit Tagen eigentlich nur dieses Problem. Ich habe mittlerweile auch so gut wie alles schon probiert und hier war meine letzte Anlaufstelle.

Gruß
Quizle
AW: C++ dll funktion an VBA in 32bit richtig übergeben
01.10.2024 20:15:02
zquizle
Hi,
danke für den Code. Ich probiere das ganze morgen mal mit dem Long Wert.
Gruß,
Quizle
Anzeige
AW: C++ dll funktion an VBA in 32bit richtig übergeben
30.09.2024 19:56:39
zquizle
Hallo Onur,
ich hatte das ganze bereits in VBA, nur ging es mir mehr darum zu schauen was so möglich ist und neue dinge zu machen. Später möchte ich ganze Strings übergeben und diese verschlüsseln können durch die DLL.

Gruß und Danke
AW: C++ dll funktion an VBA in 32bit richtig übergeben
30.09.2024 19:25:45
Volti
Noch eine Ergänzung:
Ich denke, die DLL hat mit Excel nix am Hut, sondern basiert auf der Windowsversion.
Und die sollte m.E. bei Excel 2016 auch 64 Bit sein!?
Also win64, xls32
Gruß KH
Anzeige
AW: C++ dll funktion an VBA in 32bit richtig übergeben
30.09.2024 19:53:59
zquizle
Hallo Karl-Heinz,
ich habe das ganze mal getestet und ja das Betriebssystem ist 64bit, xls 32bit. Aber leider funktioniert es über die 64bit dll nicht. Auch nicht ohne die #Win abfrage und stattdessen #VBA7. Er findet die dll richtig und kann auf sie zugreifen, nur findet er die Funktion irgendwie nicht.

Danke dir und Gruß,
Jonas
Anzeige
AW: C++ dll funktion an VBA in 32bit richtig übergeben
30.09.2024 20:09:21
Volti
Ok, aber war ein Versuch wert...

Meine DLL Aktivitäten sind schon 15 Jahre her, die Kenntnisse etwas verblasst :-)
Gruß KH

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige