![]() |
Delphi-Version: 5
Funktionsdeklaration: Beste Vorgehensweise
Hallo,
ich soll demnächst eine DLL schreiben die von einigen Tools anderer Programmierer aufgerufen wird und Informationen liefern muss. Beispielsweise habe ich eine Funktion GetProjectPath() die den Namen eines Projektes übergeben bekommt und einen dazugehörigen Pfad ermitteln soll. Bsp:
Delphi-Quellcode:
Welche Vorgehensweise wäre die bessere:
Path = GetProjectPath("Mein Projekt") // Rückgabe: "C:/Tolle Projekte/Mein Project"
Möglichkeit 1) Die Funktion bekommt den Projektnamen als PChar übergeben und liefert den ermittelten Pfad als Rückgabewert.
Delphi-Quellcode:
Möglichkeit 2)
function GetProjectPath(PrjName: PChar): PChar;
Die Funktion bekommt den Projektnamen als PChar übergeben und schreibt den Rückgabewert in einen zweiten übergebenen PChar.
Delphi-Quellcode:
procedure GetProjectPath(PrjName: PChar; Path: PChar);
Der Unterschied zwischen den beiden Möglichkeiten liegt meiner Meinung nach in der Speicherverwaltung: Bei Methode 1 ist die Funktion GetProjectPath für die Speicheranforderung verantwortlich, während bei Methode 2 die aufrufende Funktion Speicher reservieren muss. Allerdings kann diese den Speicher vor dem Aufruf der Funktion gar nicht reservieren, weil diese nicht weiß wie groß der zurückgelieferte sein wird, kann aber vorsorglich mehr Speicher als dann tatsächlich benötigt (MAX_PATH) reservieren? Habe ich das richtig erkannt? Zu welcher Methode würdet ihr mir raten? Grüße Zend |
AW: Funktionsdeklaration: Beste Vorgehensweise
Zitat:
Ich frage deshalb, weil ich hier eine ActiveX-DLL empfehlen würde. Die Probleme mit der Übergabe von Strings wären damit erledigt. |
AW: Funktionsdeklaration: Beste Vorgehensweise
Hallo,
der Aufruf muss neben C und Delphi auch aus Python heraus erfolgen welches meines Wissens nach nicht mit ActiveX umgehen kann. Grüße Zend |
AW: Funktionsdeklaration: Beste Vorgehensweise
Ansonsten über Interfaces und als Typen den WideString, Integer, Byte, ByteBool/LongBool/Boolean und Co.
in C++: LongBool = BOOL ich blaub ByteBol = bool (Boolean wäre nahezu kompatibel dazu, also soloange man nicht auf =True prüft :stupid: ) Integer = int Cardinal = uint ... WideString = ![]() Somit wäre es zu C++ und Delphi kompatibel. |
AW: Funktionsdeklaration: Beste Vorgehensweise
Zitat:
Delphi-Quellcode:
Ziemlich aufwändig für meinen Geschmack; bei einer ActiveX-DLL schreibt man einfach:
function GetProjectPath(PrjName: PChar; Path: PChar; PathSize:Integer):integer;
// so könnte der Aufruf aussehen: var len : integer; // Länge des Ergebnisses path : string; begin SetLength(path, 200 {MAX_PATH}); // Speicher reservieren len := GetProjectPath('Test', PChar(Path), Length(Path)); if len < 0 then raise Exception.Create('Puffer für GetProjectPath zu klein'); SetLength(path, len); // "path" auf tatsächliche Länge kürzen
Delphi-Quellcode:
path := objectXY.GetProjectPath('Test');
|
AW: Funktionsdeklaration: Beste Vorgehensweise
Zitat:
![]() Dann käme es nur noch darauf an, einen zeitgemässen C/C++-Compiler zu finden, der ActiveX-DLLs einbinden kann. |
AW: Funktionsdeklaration: Beste Vorgehensweise
Hallo,
mir gefällt die Vorstellung über ActiveX zu gehen. Der verwendete C-Compiler wäre der aus Visual Studio 2010. Ich denke wenn es einen gibt der damit umgehen kann, dann ist es gerade dieser oder? Grüße Zend |
AW: Funktionsdeklaration: Beste Vorgehensweise
Ich würde es so machen:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 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 by Thomas Breitkreuz