![]() |
DLL programmieren
Hallo,
ich beschäftige mich gerade mit DLLs. Da ich die Verwendung der ShareMem Unit vermeiden will, übergebe ich die Strings als PChar. Meine Fragen sind nun: 1. Kann man in den Funktionen trotzdem Strings verwenden? Oder zum Beispiel String Funktionen. IntToStr, ReverseString, ... 2. DecToX und XToDec sollen von einer anderen Software nicht aufgerufen werden können. Reicht es diese nicht in den Exports zu schreiben? MFG Christian18
Delphi-Quellcode:
library DLLNumberSystems;
uses SysUtils, Classes, StrUtils, Math; {$R *.res} function DecToX(Value: Byte; Basis: Byte) : PChar; begin Result:=''; while Value > 0 do begin case Value mod Basis of 10 : Result:=PChar(Result + 'A'); 11 : Result:=PChar(Result + 'B'); 12 : Result:=PChar(Result + 'C'); 13 : Result:=PChar(Result + 'D'); 14 : Result:=PChar(Result + 'E'); 15 : Result:=PChar(Result + 'F'); else Result:=PChar(Result + IntToStr(Value mod Basis)); end; Value:=Value div Basis; end; Result:=PChar(ReverseString(Result)); end; function XToDec(Value: PChar; Basis: Byte) : Byte; var i : Integer; // Schleifenvariable begin Result:=0; Value:=PChar(ReverseString(Value)); for i:=1 to Length(Value) do begin case Value[i] of 'A' : Result:=Result + Round((10 * Power(Basis, i - 1))); 'B' : Result:=Result + Round((11 * Power(Basis, i - 1))); 'C' : Result:=Result + Round((12 * Power(Basis, i - 1))); 'D' : Result:=Result + Round((13 * Power(Basis, i - 1))); 'E' : Result:=Result + Round((14 * Power(Basis, i - 1))); 'F' : Result:=Result + Round((15 * Power(Basis, i - 1))); else Result:=Result + Round((StrToInt(Value[i]) * Power(Basis, i - 1))); end; end; end; function HexToDec(Value: PChar) : PChar; begin Result:=PChar(IntToStr(XToDec(Value, 16))); end; function HexToOct(Value: PChar) : PChar; begin Result:=PChar(DecToX(XToDec(Value, 16), 8)); end; function HexToBin(Value: PChar) : PChar; begin Result:=PChar(DecToX(XToDec(Value, 16), 2)); end; function DecToHex(Value: PChar) : PChar; begin Result:=PChar(DecToX(StrToInt(Value), 16)); end; function DecToOct(Value: PChar) : PChar; begin Result:=PChar(DecToX(StrToInt(Value), 8)); end; function DecToBin(Value: PChar) : PChar; begin Result:=PChar(DecToX(StrToInt(Value), 2)); end; function OctToHex(Value: PChar) : PChar; begin Result:=PChar(DecToX(XToDec(Value, 8), 16)); end; function OctToDec(Value: PChar) : PChar; begin Result:=PChar(IntToStr(XToDec(Value, 8))); end; function OctToBin(Value: PChar) : PChar; begin Result:=PChar(DecToX(XToDec(Value, 8), 2)); end; function BinToHex(Value: PChar) : PChar; begin Result:=PChar(DecToX(XToDec(Value, 2), 16)); end; function BinToDec(Value: PChar) : PChar; begin Result:=PChar(IntToStr(XToDec(Value, 2))); end; function BinToOct(Value: PChar) : PChar; begin Result:=PChar(DecToX(XToDec(Value, 2), 8)); end; exports HexToDec, HexToOct, HexToBin, DecToHex, DecToOct, DecToBin, OctToHex, OctToDec, OctToBin, BinToHex, BinToDec, BinToOct; begin end. |
Re: DLL programmieren
Zitat:
Zitat:
|
Re: DLL programmieren
Ich habe meinen Code in meinen ersten Post mitgegeben. Ist da alles soweit ok, oder könnte man was besser machen?
|
Re: DLL programmieren
Ich habe gerade mal probiert eine Funktion aus der DLL aufzurufen. Es kommt eine Fehlermeldung:
[Error] '' ist kein gültiger Integerwert. [/Error]
Delphi-Quellcode:
Was habe ich falsch gemacht?
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} function DecToBin(Value: PChar) : PChar; stdcall; external 'DLLNumberSystems.dll'; procedure TForm1.FormCreate(Sender: TObject); begin Label1.Caption:=DecToBin('200'); end; end. MFG Christian18 |
Re: DLL programmieren
Die Aufrufkonventionen stimmen nicht überein.
Des Weiteren hast du es dir mit den PChars deutlich zu einfach gemacht (auf DLL-Seite). Wenn die Funktionen verlassen werden, wird der String freigegeben und es ist reines Glück, falls im PChar immer noch die alte Zeichenkette steht. |
Re: DLL programmieren
Zu Zeichenketten und DLLs:
![]() Du solltes einen Buffer als Paramter übergeben. |
Re: DLL programmieren
Zitat:
|
Re: DLL programmieren
Siehe mein Posting.
|
Re: DLL programmieren
{erledigt - siehe unten}
Ich habe eine Frage zum selben Thema: Ich arbeite an einer *.dll, die eine Mehtode enthält, welche später von 2 Threads aufgerufen wird. Das Problem ist, dass einige Anweisungen nicht mit kompiliert werden:
Delphi-Quellcode:
Von den 10 Zeilen Code in der function werden nur 2 mit kompiliert: fCounter und fBitmap. Weiß jemand, woran das liegen könnte?
library Thread;
uses SysUtils, Classes, Graphics; type TThreadParams = packed record public Center_x, Center_y, Range_x, Range_y, MaxValue, dx, dy: extended; MaxIterations, Counter: integer; Bitmap: TBitmap; end; PThreadParams = ^TThreadParams; {$R *.res} function ThreadFunc(Params: PThreadParams): Cardinal; var fBitmap: TBitmap; fMaxIterations, fCounter: integer; fCenter_x, fCenter_y, fRange_x, fRange_y, fMaxValue, fdx, fdy: extended; begin // Parameter auslesen fCounter:=PThreadParams(Params)^.Counter; // wird kompiliert fdx:=PThreadParams(Params)^.dx; fdy:=PThreadParams(Params)^.dy; fCenter_x:=PThreadParams(Params)^.Center_x; fCenter_y:=PThreadParams(Params)^.Center_y; fRange_x:=PThreadParams(Params)^.Range_x; fRange_y:=PThreadParams(Params)^.Range_y; fMaxIterations:=PThreadParams(Params)^.MaxIterations; fMaxValue:=PThreadParams(Params)^.MaxValue; fBitmap:=PThreadParams(Params)^.Bitmap; // wird kompiliert //[...] end; exports ThreadFunc; begin end. edit: Im Kontext mit meinem Programm/Thread gibts da wohl noch mehr Probleme. fCounter sollte 0 oder 1 sein, ist aber 1073383560 -.- Das ändert natürlich nichts dran, dass die vielen Zeilen beim Kompilieren nicht beachtet werden... Okay, lag an mir. Ich hatte den Rest der function zum debuggen auskommentiert, da wurden dann auch die Zuweisungen nicht mehr mitkompiliert (Varaible never used) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:54 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