![]() |
Delphi DLL und Aufruf in Excel VBA
Hallo zusammen,
ich habe mich nun schon dusselig gelesen wegen einer kleinen DLL Ziel der Übung, ich möchte eine DLL in VBA aufrufen und einen Wert übergeben (Procedure) Der Wert soll dann als QRCode gewandelt werden und mittels Clipboard wieder ins Excel rein. Den Quelltext zum Clipboard transfer hab ich noch nicht getestet, soweit kommts gar nicht weil ich den Text nicht sauber in die DLL bekomme. Mein Code dazu in Excel
Code:
Meine DLL
Declare Sub QRtoClipboard Lib "C:\_Programmausgabe\Exceltest\QRgenerator.dll" (ByVal value As String)
Sub Schaltfläche1_Klicken() Dim a As String a = "Test123" QRtoClipboard (a) ActiveSheet.Cells("A20").Select ActiveSheet.Paste End Sub
Delphi-Quellcode:
Die DLL wird auch aufgerufen, ich bekomm aber nur Chinesische Schriftzeichen. Wie muss ich in VBA und Delphi die Variable value deklarieren damit ich da den Text sauber übernehmen kann.
library QRgenerator;
uses Windows, System.SysUtils, uZintBarcode, VCL.Graphics, VCL.Clipbrd, System.Classes, VCL.Dialogs; {$R *.res} procedure QRtoClipboard(value:PWidechar);stdcall; var mycode:TZintbarcodeComponent; mybmp:TBitmap; MyFormat : Word; AData : THandle; APalette : HPALETTE; a:String; begin; try a:=String(value); if a<>'' then begin; mycode:=TZintBarcodeComponent.Create(nil); mybmp:=TBitmap.Create; mycode.Barcode.BarcodeType:=tBARCODE_QRCODE; mycode.Barcode.Data:=a; mycode.Barcode.Scale:=2; mycode.Barcode.GetBarcode(mybmp); Clipboard.Assign(mybmp); (* mybmp.SaveToClipBoardFormat( MyFormat, AData, APalette); ClipBoard.SetAsHandle(MyFormat,AData); *) mycode.Free; mybmp.Free; end; except Showmessage('DLL Fehler: übergebener Wert "'+a+'"'); end; end; exports QRtoClipboard; begin end. Gruß Matthias |
AW: Delphi DLL und Aufruf in Excel VBA
Hmm..
Könnte es sein, das 'string' in VBA kein WideString ist? Und Du übergibst dort den String und nicht den Pointer.. (Nur geraten, kenne VBA nicht so... ;) ) |
AW: Delphi DLL und Aufruf in Excel VBA
Probiere mal so:
procedure QRtoClipboard(value: WideString); stdcall; |
AW: Delphi DLL und Aufruf in Excel VBA
exports ByRef nicht ByVal
sonst bekommst du Stack Probleme in VB und keinen WideString sondern PAnsiString\PAnsiChar. Danach kannst du den Pointer bzw.. den String in VB auf dieser weise auslesen.
Code:
"QRgenerator.dll"
Public Function VBStrFromAnsiPtr(ByVal lpStr As Long) As String
Dim bStr() As Byte Dim cChars As Long On Error Resume Next ' Get the number of characters in the buffer cChars = lstrlen(lpStr) If cChars Then ' Resize the byte array ReDim bStr(0 To cChars - 1) As Byte ' Grab the ANSI buffer Call CopyMemory(bStr(0), ByVal lpStr, cChars) End If ' Now convert to a VB Unicode string VBStrFromAnsiPtr = StrConv(bStr, vbUnicode) End Function sollte reichen.. solange die Datei sich im Anwendungspfad befindet. Wenn du Probleme beim debuggen hast dann sorge dafür das sich die DLL zusätzlich noch im Pfad der VBA.exe befindet. Sonst könnte es sein das diese nicht gefunden wird. ops.. sehe gerade das du den string aus VBA schicken willst ok dann kannst du einiges in meinem Beitrag ignorieren. gruss |
AW: Delphi DLL und Aufruf in Excel VBA
Hallo,
ich bin leider nicht weitergekommen, Es müsste ein PWideChar sein den ich in Delphi deklarieren muss in VBA wenn ich ByRef einsetze bekomm ich direkt einen Aufruffehler (5) in VBA Byval bekomm ich Hyroglyphen und dann einen Fehler (5) jemand noch eine Idee oder sowas schon mal gemacht? Gruß Matthias |
AW: Delphi DLL und Aufruf in Excel VBA
Zitat:
Zitat:
Beispiel aus meine DLL.. der string wird so gesendet.. VB..
Code:
Case BASSVISKIND_WMP
With mInfos .SongTitle = MediaTitle End With BASSVIS_SetInfo mVisParam, mInfos
Code:
Public Type BASSVIS_INFO
SongTitle As String ' SongTitel ohne Pfad Songfile As String ' SongFile incl. Pfad (StreamFile) End Type
Delphi-Quellcode:
PBASSVIS_INFO = ^TBASSVIS_INFO;
TBASSVIS_INFO = record SongTitle : PAnsiChar; // Titel mit vorstehener TitelNr ('1. ') Songfile : PAnsiChar; // SongTitel incl. Pfad end;
Delphi-Quellcode:
gruss
function BASSVIS_SetInfo(Param: PBASSVIS_PARAM; Infos: PBASSVIS_INFO):
BOOL; stdcall; begin Result := False; case Param^.Kind of BASSVISKIND_WINAMP: begin Result := BASSWinampVisAPI.WINAMPVIS_SetChanInfo(Param^.VisHandle, Infos^.SongTitle, Infos^.Songfile); |
AW: Delphi DLL und Aufruf in Excel VBA
Danke,
habs jetzt anders gelöst über Variant, Wenn ich aber die Exceldatei neu aufmache dann findet er die dll nicht wenn das Verzeichnis nicht mit angegeben ist. Geb ich das Verzeichnis an läuft die dll. hier mein Funktionierender Code
Code:
Declare Sub QRtoClipboard Lib "QRgenerator.dll" (ByVal value As Variant)
Sub Schaltfläche1_Klicken() Dim a As Variant a = ActiveSheet.Range("A1") QRtoClipboard (a) ActiveSheet.Range("A20").Select ActiveSheet.Paste End Sub
Delphi-Quellcode:
procedure QRtoClipboard(value: OLEVariant);stdcall;
var mycode:TZintbarcodeComponent; mybmp:TBitmap; MyFormat : Word; AData : THandle; APalette : HPALETTE; a,afehler:String; begin; try //a:=String(value); a:=value; |
AW: Delphi DLL und Aufruf in Excel VBA
Zitat:
Hier noch ein paar Infos ![]() na ja Variants sind nicht das gelbe vom Ei aber bitte wie du willst. Du könntest auch as Any verwenden. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz