PChar und string
Hallo, warum funtioniert unter Delphi.NET PChar(string) nicht mehr? Was muss ich tun? Ich brauche das, weil ich eine alte Win32 DLL verwenden muss die als Parameter PChar benötigt. :(
|
Re: PChar und string
Mit .net kenn ich mich auch net aus. aber versuchs mal mit @string[1] (nix anderes macht pchar())
|
Re: PChar und string
PChar ist ein Zeiger und unter .NET nutzt man keine Zeiger mehr (außer in unsafe Code und der ist recht selten).
Für was brauchst du denn den PChar? Das lässt sich sicherlich anders regeln. |
Re: PChar und string
Mach mal einen Punkt hinter deinen String, du wirst überrascht sein was es alles gibt!
|
Re: PChar und string
Zitat:
Zitat:
|
Re: PChar und string
Zitat:
|
Re: PChar und string
Zitat:
Dann musst du noch den Compilerschalter "Unsafecode Compileren" anmachen! |
Re: PChar und string
Ja hab ich doch, ist ja auch nur ne Warnung. Mit Function(@'dkshskhf'[1]) geht es auch, aber mit Function(@stringvar[1]) bekommen ich
"[Error] your.pas(97): E2354 String element cannot be passed to var parameter" obwohl Function(varname: PChar) nix mit var parameter definiert hat! Das treibt mich echt in den Wahnsinn! |
Re: PChar und string
Zitat:
Ich bin mir sicher, dass man den Code auch anders, ohne Zeiger implementieren kann. Selbst die Borland.Vcl.Windows.pas nutzt keine PChars mehr sonden nur noch string, die vom Marshaller dann automatisch beim Aufruf richtig konvertiert werden. Wenn du Zeiger unbedingt in .NET haben willst, dann kompiliere die Unit in eine DLL und binde sie über P/Invoke in .NET ein. |
Re: PChar und string
Was mich am meisten nervt ist, wenn Leute labern, aber nicht lesen, warum das so ist! Nochmal für Dich:
ICH MUSS EIN WIN32.DLL EINBINDEN FÜR DIE ES KEINE ALTERNATIVE GIBT, WEDER IN WIN32, NOCH IN .NET! GAR KEINE! Aber ich muss mich auch nicht erklären, es reicht doch, wenn ich sage, dass ich ein Win32.dll einbinden muss, die nunmal als Parameter PChar erwartet (VB-DLL :( ) ! Oder erzähl Du mir doch, wie ich ASP.NET als Win32 baue, oder einen Win32 Modul in DotNetNuke bekomme! Es gibt für alles einen Grund, akzeptier es einfach! |
Re: PChar und string
Zitat:
Zitat:
Schauen wir uns mal die Win32API Funktion SetCurrentDirectory an: Unter Win32:
Delphi-Quellcode:
function SetCurrentDirectoryA(lpPathName: PAnsiChar): BOOL; stdcall; external kernel32 name 'SetCurrentDirectoryA';
Unter .NET:
Delphi-Quellcode:
Ups. Wo ist denn der PChar geblieben :gruebel: - Ach den braucht man da gar nicht mehr. :shock:
[SuppressUnmanagedCodeSecurity, DllImport(kernel32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'SetCurrentDirectoryA')]
function SetCurrentDirectoryA(lpPathName: string): BOOL; external; |
Re: PChar und string
Das ist echt phänomenal. Man muss Leute erst reizen, bevor man mal klare Lösungen bekommt. Sorry, hatte .NET heute nicht im Frühstück, aber trotzdem Danke. Leider funktioniert diese verdamm... DLL immer noch nicht. Es ist kein Geheimniss, es handelt sich dabei um die sevDTA32.dll (sevDTA32). Falls jemand eine Alternative kennt, bin ich auch dankbar! Btw. mit Kooperation des Hersteller kann man als "nicht VBler" nicht rechnen! "Unter VB.NET geht es ..."
Dabei geht es um folgendes:
Delphi-Quellcode:
Was unter Win32 immer funktionierte, mir nun aber kein Ergebniss und schon gar keinen Banknamen zurück gibt.
SetLength(sPz, 3);
SetLength(BankName, 28); KtoResult := sevDTA_BLZGetInfo(BankNumber, BankName, sPz); |
Re: PChar und string
Zitat:
Zitat:
Zitat:
Probiere mal folgendes:
Delphi-Quellcode:
Ach ja, der Quellcode "stinkt" nach VB-Programmierung. Ein externes Handle wird in .NET nicht einfach mit einem Integer abgegolten. Dafür nutzt man normalerweise einen IntPtr. Aber da es für mich auf die Schnelle nicht ersichtlich ist, welcher der Integer nun ein Boolean, ein Integer oder ein Handle ist, habe ich es einfach mal bei Integer belassen.
uses
System.Runtime.InteropServices; [DllImport('sevDTA32.DLL', CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)] function sevDTA_BLZExists([MarshalAs(UnmanagedType.VBByRefStr)] var sBlz: string): Integer; [DllImport('sevDTA32.DLL', CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)] function sevDTA_BLZFileDate([MarshalAs(UnmanagedType.VBByRefStr)] var sDatum: string): Integer; [DllImport('sevDTA32.DLL', CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)] function sevDTA_BLZGetInfo([MarshalAs(UnmanagedType.VBByRefStr)] var sBlz: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sName: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sPz: string): Integer; [DllImport('sevDTA32.DLL', CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)] procedure sevDTA_BLZSetPath([MarshalAs(UnmanagedType.VBByRefStr)] var sPath: string); [DllImport('sevDTA32.DLL', CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)] function sevDTA_CheckCreditCard([MarshalAs(UnmanagedType.VBByRefStr)] var sCardType: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sCardNr: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sMsgText: string; nLenReturn: Integer): Integer; [DllImport('sevDTA32.DLL', CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)] function sevDTA_CheckKontoNr([MarshalAs(UnmanagedType.VBByRefStr)] var sBlz: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sKontoNr: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sPz: string): Integer; [DllImport('sevDTA32.DLL', CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)] procedure sevDTA_Close(lHandle: Integer); [DllImport('sevDTA32.DLL', CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)] procedure sevDTA_CloseFile(fHandle: Integer); [DllImport('sevDTA32.DLL', CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)] function sevDTA_CreateFile([MarshalAs(UnmanagedType.VBByRefStr)] var sFilename: string; iOvrWriteExists: Integer): Integer; [DllImport('sevDTA32.DLL', CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)] function sevDTA_FileAddRec(fHandle: Integer; [MarshalAs(UnmanagedType.VBByRefStr)] var sBlz1: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sKtoNr1: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sName1: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sIntKdNr: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sBlz2: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sKtoNr2: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sName2: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sVerwendung: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sBetrag: string): Integer; [DllImport('sevDTA32.DLL', CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)] function sevDTA_FileAddRecEx(fHandle: Integer; [MarshalAs(UnmanagedType.VBByRefStr)] var sBlz1: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sKtoNr1: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sName1: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sIntKdNr: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sBlz2: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sKtoNr2: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sName2: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sVerwendung: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sBetrag: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sTextschl: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sTextschlErw: string): Integer; [DllImport('sevDTA32.DLL', CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)] function sevDTA_FileEnd(fHandle: Integer): Integer; [DllImport('sevDTA32.DLL', CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)] function sevDTA_FileInit(fHandle: Integer; [MarshalAs(UnmanagedType.VBByRefStr)] var sKz: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sBlz: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sKtoNr: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sName: string; iEuro: Integer): Integer; [DllImport('sevDTA32.DLL', CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)] function sevDTA_Init([MarshalAs(UnmanagedType.VBByRefStr)] var sInit: string): Integer; [DllImport('sevDTA32.DLL', CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)] function sevDTA_Kontrollsummen([MarshalAs(UnmanagedType.VBByRefStr)] var SumDaten: string; [MarshalAs(UnmanagedType.VBByRefStr)] var SumBLZ: string; [MarshalAs(UnmanagedType.VBByRefStr)] var SumKtoNr: string; [MarshalAs(UnmanagedType.VBByRefStr)] var SumBetrag: string): Integer; [DllImport('sevDTA32.DLL', CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)] procedure sevDTA_Print(hDC: Integer; [MarshalAs(UnmanagedType.VBByRefStr)] var prnName: string; [MarshalAs(UnmanagedType.VBByRefStr)] var FontName: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sName: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sBlz: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sKtoNr: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sDatum: string); [DllImport('sevDTA32.DLL', CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)] procedure sevDTA_PrintEx(hDC: Integer; [MarshalAs(UnmanagedType.VBByRefStr)] var prnName: string; [MarshalAs(UnmanagedType.VBByRefStr)] var FontName: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sName: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sBlz: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sKtoNr: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sDatum: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sVolNr: string; [MarshalAs(UnmanagedType.VBByRefStr)] var sLogNr: string); |
Re: PChar und string
Na dann zieh ich mir o.a. morgen mal rein, muss jetzt noch dringend was anderes fertig machen. Aber Du siehst, dass es schon ziemlicher Horror ist, wenn man noch nicht so in .NET steckt, dann noch der VB-Horror dazu kommt ...
|
Re: PChar und string
|
Re: PChar und string
Verzeiht mir wenn ich den Thread nochmal hochhole, aber wie sieht den die Übergabe eines Stings als PChar an eine DLL in C# aus? Komme irgendwie nicht auf einen Grünen Zweig!
|
Re: PChar und string
Schon mal was von google gehört?
Code:
[DllImport("MyLib.dll", EntryPoint="MyFunc")]
public static extern int MyFunc(string s); |
Re: PChar und string
Delphi-Quellcode:
versuchs mal so.
DLLFunction(PChar('test'));
|
Re: PChar und string
Er schreibt von C# => .NET. Und da gibt es keinen PChar.
|
Re: PChar und string
Zitat:
|
Re: PChar und string
Zitat:
Ich sehe mal in meine Kristallkugel: Die Funktion ändert den übergebenen String. Dann musst du den String durch einen StringBuilder ersetzen:
Code:
using System.Text;
[DllImport("MyLib.dll", EntryPoint="MyFunc")] public static extern int MyFunc(StringBuilder s); public void bla() { StringBuilder sb(100); // 100 Zeichen reservieren MyFunc(sb); Console.WriteLine(sb); } |
Re: PChar und string
Du hast falsch in die Kristallkugel geguckt!
Um genau zu sein gibt die Funktion einen Pointer auf eine Funktion zurück, dies geschieht aber nicht! |
Re: PChar und string
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz