Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Klasse von C nach Pascal übersetzen? (https://www.delphipraxis.net/5155-klasse-von-c-nach-pascal-uebersetzen.html)

Dani 25. Mai 2003 22:36


Klasse von C nach Pascal übersetzen?
 
Hallo Leute,

Ich versuche gerade, folgende Klasse inkl. Zugriff auf diese nach Delhpi zu übersetzen, habs aber bisher nicht geschafft:


If you need access to information returned by calling the external code, your code source must also include the following class definition:

class CViseEntryData
{
public:
HWND m_hwndMain; // Main window handle
HWND m_hwndProgress; // Progress dialog window handle
BOOL m_bUninstall; // Uninstaller flag
LPCSTR m_lpszUninstallLogFile; // Uninstall log file path
LPCSTR m_lpszTempDir; // Installer VISE’s temp directory path
HINSTANCE m_hinst; // Instance handle of the VISE dll
char m_szInstallerName[_MAX_PATH]; // Name of the installer
};

und hierran scheiterts:
In order to correctly format the information defined in the CViseEntryData class, your
external code must include the following line:
CViseEntryData* pViseEntryData = (CViseEntryData*)dwReserved;
You may then access the CViseEntryData class information in your external code using
the following convention:
pViseEntryData->m_lpszTempDir;

--------------------------------------------------------
Was bedeuten diese Ausdrücke??

CViseEntryData* pViseEntryData = (CViseEntryData*)dwReserved;
und
pViseEntryData->m_lpszTempDir;

Kein Wort über eine zu erstellende pViseEntryData Variable im Text, und was "->" im C-Syntax bedeutet weiss ich leider auch net :(

Kann mir da jemand helfen? :wink:

Chewie 25. Mai 2003 22:40

pViseEntryData ist nur ein Zeiger auf eine Instanz von CViseEntryData, und das ->-Zeichen enstpricht dem ., nur dass es bei Zeigern anstelle des Punktes verwendet werden muss.

Dani 25. Mai 2003 22:42

Zitat:

Zitat von Chewie
das ->-Zeichen enstpricht dem ., nur dass es bei Zeigern anstelle des Punktes verwendet werden muss.

Okay, muss ich das auch in Delphi oder kann ich wie gehabt den Punkt verwenden?

Ich hätte vielleicht dazusagen sollen, dass es darum geht, in einer von einem Installer aufgerufenen DLL, auf bestimmte Informationen wie den Window-Handle des Installers zuzugreifen.

Ich schätze mal, dass

"CViseEntryData* pViseEntryData = (CViseEntryData*)dwReserved;"

dafür verantwortlich ist, die Variable mit den Informationen zu füllen?

"dwReserved" ist eine Variable, die der exportierten Funktion der aufgerufenen DLL übergeben wird.

Leider hab ich noch nicht richtig kapiert, was nun richtig ist...

Delphi-Quellcode:
var pViseEntryData: ^CViseEntryData;
{oder}
var InstInfo: CViseEntryData;
^InstInft.MainWindowHandle
{oder}
var pViseEntryData: CViseEntryData;
pViseEntryData:= CViseEntryData.create;
pViseEntryData.MainWindowHandle
{...}

jbg 25. Mai 2003 22:44

1. Mit welchem Compiler wurde die Klasse kompiliert? Bei Borland Compiler ist der aufwand geringer.

2. Wer deklariert eine reine Datenstruktor (Record) als Klasse? Ich sehe keine einzige Methode in der Klasse, die die Verwendung von Class rechtfertigen würde. Eine struct hätte es auch getan.

3. "->" bedeutet "^." in Delphi und da Delphi automatisch die Zeiger dereferenziert, reicht ein "."

4. dwReserved woher kommt denn diese Variable? Irgendwoher muss die ja kommen. Ist das ein Parameter der Funktion?


Delphi-Quellcode:
var pViseEntryData: PCViseEntryData;
begin
  pViseEntryData := PViseEntryData(dwReserved);
end;
Delphi-Quellcode:
PCViseEntryData = ^TCViseEntryData;
TCViseEntryData = object
  m_hwndMain: HWND; // Main window handle
  m_hwndProgress: HWND; // Progress dialog window handle
  m_bUninstall: BOOL; // Uninstaller flag
  m_lpszUninstallLogFile: PChar; // Uninstall log file path
  m_lpszTempDir: PChar; // Installer VISE’s temp directory path
  m_hinst: THandle; // Instance handle of the VISE dll
  m_szInstallerName: array[0.._MAX_PATH - 1] of Char; // Name of the installer
end;

Dani 25. Mai 2003 23:00

Besten Dank schonmal!

Beim compilieren von dem hier, kommt aber leider noch der Fehler "Operator oder Semikolon fehlt":

Delphi-Quellcode:
library ViseEntryData;

uses
  SysUtils,
  Windows,
  Dialogs;

{$E DLL}

{R *.res}

type
PCViseEntryData = ^TCViseEntryData;
TCViseEntryData = object
  m_hwndMain: HWND; // Main window handle
  m_hwndProgress: HWND; // Progress dialog window handle
  m_bUninstall: BOOL; // Uninstaller flag
  m_lpszUninstallLogFile: PChar; // Uninstall log file path
  m_lpszTempDir: PChar; // Installer VISE’s temp directory path
  m_hinst: THandle; // Instance handle of the VISE dll
  m_szInstallerName: array[0..MAX_PATH - 1] of Char; // Name of the installer
end;

const
 nz=#13+#10;

var pViseEntryData: PCViseEntryData;

function ViseEntry(lParam1:LongInt; lpParam2:LPCSTR; dwReserved:DWORD):LongInt; stdcall;
begin
Result:=1;
pViseEntryData := PViseEntryData(dwReserved);
ShowMessage('Welcome to ' + pViseEntryData.m_szInstallerName + '.' + nz
            + 'The temporary directory is ' + pViseEntryData.m_lpszTempDir);

end;




exports
    ViseEntry;
{$R *.RES}

begin


end.
Und zwar in der Zeile "pViseEntryData := PViseEntryData(dwReserved);"
Hab ich da was falsch eingetragen?!

jbg 26. Mai 2003 06:10

Zitat:

Zitat von Dani
Und zwar in der Zeile "pViseEntryData := PViseEntryData(dwReserved);"
Hab ich da was falsch eingetragen?!

Da habe ich das Zeichen "C" in PCViseEntryData vergessen.

Dani 26. Mai 2003 12:15

Super, jetzt passts! :)
Tausend Dank nochmal für die Mühe!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:01 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