Laden...

Code von Delphi in C# umsetzen

Erstellt von Nachtwind vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.080 Views
N
Nachtwind Themenstarter:in
118 Beiträge seit 2005
vor 15 Jahren
Code von Delphi in C# umsetzen

Hab leider kaum Ahnung von Delphi und bisher hat keine idee von mir funktioniert dies in C# umzusetzen.
Im grunde sind das die Funktionen, die ich in einer externen DLL aufrufen muesste.. aber bislang hat es, wie gesagt, nicht funktioniert das umzusetzen. Bekomme dann immer Speicherzugriffsfehler..

  TInitFunc = function(SizeX,SizeY : byte; StartupParameters : pchar; OK : pboolean) : pchar; stdcall;
  TDoneProc = procedure; stdcall;
  TSetPositionProc = procedure(X, Y: byte); stdcall;
  TWriteProc = procedure(Str : pchar); stdcall;
  TCustomChar = procedure(Chr : byte; Data : TCustomArray); stdcall;
  TReadKeyFunc = function : word; stdcall;
  TSetBacklightProc = procedure(LightOn : boolean); stdcall;
  TSetContrastProc = procedure(Contrast : byte); stdcall;
  TSetBrightnessProc = procedure(Brightness : byte); stdcall;
  TPowerResumeProc = procedure; stdcall;
  TSetGPOProc = procedure(GPO : byte; GPOOn : boolean); stdcall;
  TSetFanProc = procedure(T1,T2 : byte); stdcall;
 TCustomCharIndex = function(Index : byte) : byte; stdcall;

Kann das jemand uebersetzen?

Danke schonmal

J
3.331 Beiträge seit 2006
vor 15 Jahren

Hallo,

was willst Du in C# eigentlich erreichen? Deine Code-Schnipsel sind doch nichts anderes als die Deklarationen (bzw. Bekanntgabe) von Funktionen und Prozeduren. Unter C# entsprechen dem die delegate-Anweisungen:

public delegate string InitFunc(byte SizeX, byte SizeY, 
    string StartupParameters, bool OK);
public delegate void DoneProc();

Dabei habe ich es mir einfach gemacht und pchar durch string sowie pboolean (wirklich bool als Zeiger?) durch bool ersetzt; die Deklaration als stdcall dürfte AFAIK nicht von Bedeutung sein.

Unklar ist mir allerdings, in welchem Zusammenhang Du diese Deklarationen verwenden willst. Daraus ergibt sich auch die Frage, wodurch bzw. wobei der Speicherzugriffsfehler auftritt.

Oder willst Du eine unter Delphi erstellte DLL (nicht NET, sondern Win32) von C# aus einbinden und nutzen? Dann muss ich Dich auf die Forumssuche verweisen, z.B. ausgehend von WMI.

Gruß Jürgen

N
Nachtwind Themenstarter:in
118 Beiträge seit 2005
vor 15 Jahren

das ganze ist ein wenig komplizierter. Ich habe hier eine Reihe DLLs, die ich in ein programm mittels Extern.. einbinden will. Das Interface fuer diese DLLs stand in der Form, wie ich ihn hier gepostet hatte in einer Delphi Datei, da sie vorher von einem in Delphi geschriebenem Programm benutzt wurden.
Die ZUgriffsverletzung kam, wenn ich eine Funktion in der DLL starten wollte - aber ich schaetze, dass das daran hing, dass ich die DLL falsch aufgerufen habe..

Aber danke fuer deine Hilfe, wusste nichts mit pbchar anzufangen, aber wenn man da einfach string fuer benutzen kann ist alles etwas einfacher..

J
3.331 Beiträge seit 2006
vor 15 Jahren

Damit keine falschen Überlegungen stehenbleiben, muss ich noch etwas kommentieren.

das ganze ist ein wenig komplizierter.

Das sehe ich ebenso. Aus Deiner Beschreibung kann ich nämlich nichts ableiten, womit ich Dir ernsthaft helfen könnte.

...wusste nichts mit pchar anzufangen, aber wenn man da einfach string fuer benutzen kann ist alles etwas einfacher..

Meine Vereinfachung ist mit größter Vorsicht zu genießen. Delphi-Strings sind eine Eigenentwicklung von Delphi: im Char 0 steht die Länge, dann kommt ab Char 1 der Inhalt. PChar = char* sind nullterminierte Strings (ursprünglich nur unter C), bei denen die Länge nicht eingetragen wird, die Indizierung bei Char 0 beginnt und das Ende des Strings durch das Null-Byte (hex 00) markiert wird. Ein String ist also eigentlich ein Zeiger auf einen nullterminierten Char-Array. Beim Datenaustausch zwischen Programmen muss ein Delphi-String (fast) immer in einen C-String, also PChar, konvertiert werden - deshalb sehen Deine Funktionsdeklarationen so aus, wie sie sind.

Unter NET und C# interessiert die interne String-Speicherung überhaupt nicht.

Ob meine Vereinfachung überhaupt zulässig ist, muss deshalb offen bleiben. Auch Deine Erläuterung hat mich leider nicht weitergeführt. Jürgen