Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   C Codeschnipsel nach Delphi (https://www.delphipraxis.net/44031-c-codeschnipsel-nach-delphi.html)

Jelly 12. Apr 2005 11:47


C Codeschnipsel nach Delphi
 
Ich hab leider nicht den Durchblick in C, muss aber folgenden Code nach Delphi transferieren... Kann mir da einer bischen helfen, zumindest die Grundzüge.

Ich blick einfach nicht was das mit den Sternchen auf sich hat.
Code:
#include <windows.h>

typedef struct _AdvancedDllStruct

   int (WINAPI *AddedFile)(char *lpFileName);
   int (WINAPI *AddedKey)(HKEY hKeyRoot,char *lpPath);
   int (WINAPI *AddedValue)(HKEY hKeyRoot,char *lpPath,char *lpValueName);
   int (WINAPI *AddShared)(char *lpSharedFile);
   int (WINAPI *BackupFile)(char *lpFileName);
   int (WINAPI *CreateDirectory)(char *lpDirectory);
   char * lpCommandLine;
   HBITMAP hbmDialog;
   BOOL bSilent;
   DWORD *lpdwFlags;
   char *(WINAPI *GetVariableString)(char *lpVariable);
   int (WINAPI *GetVariableInt)(char *lpVariable);
   int (WINAPI *SetVariableString)(char *lpVariable,char *lpValue);
   int (WINAPI *SetVariableInt)(char *lpVariable,int iValue);
} AdvancedDllStruct;

AdvancedDllStruct *g_pADS = NULL;

long WINAPI AdvancedEntry(AdvancedDllStruct *lpAdvancedDllStruct)

   g_pADS = lpAdvancedDllStruct;
   return 1;


long WINAPI OnMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, long lDialogId)

  if (lDialogId == 7 && uMsg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDOK)
  { 
    char szParentDirectory[MAX_PATH] = {0};
    GetDlgItemText(hWnd, 10, szParentDirectory, MAX_PATH);
    if (strchr(szParentDirectory, '\\') != strrchr(szParentDirectory, '\\') && szParentDirectory[strlen(szParentDirectory) - 1] == '\\')
        szParentDirectory[strlen(szParentDirectory) - 1] = 0;
    if (strrchr(szParentDirectory, '\\') != NULL)
      *strrchr(szParentDirectory, '\\') = 0;
    g_pADS->SetVariableString("<InstallDirParent>", szParentDirectory);
  } 

  return 0;
}

Robert Marquardt 12. Apr 2005 12:14

Re: C Codeschnipsel nach Delphi
 
Das ist Teil einer groesseren Infrastruktur (MFC) und laesst sich daher nicht sinnvoll konvertieren.
Die Source selbst laesst sich problemlos konvertieren, aber ob man sich wirklich mit Delphi-Code in die MFC einklinken sollte?

OnMessage ist offensichtlich der OnClick-Event des OK-Buttons eines Dialogs.
Es wird offensichtlich der Pfad einer Directory ausgelesen (Editfeld oder aehnlich).
Der Pfad wird noch ein bischen nachbearbeitet und dann die Funktion (genauer Funktionszeiger) SetVariableString aufgerufen,
die Teil der globalen Zeigervariable g_pADS ist. g_pADS ist ein Zeiger auf ein Record.

Jelly 12. Apr 2005 12:20

Re: C Codeschnipsel nach Delphi
 
Heisst das im Klartext, es ist sinnvoller, das Ganze in C zu belassen?

Robert Marquardt 12. Apr 2005 12:36

Re: C Codeschnipsel nach Delphi
 
Entweder man laesst es in C oder konvertiert nicht, sondern programmiert das Programm mit der VCL nach.

AdvancedDllStruct ist ein Record mit Zeigern auf Funktionen (und ein paar anderen Elementen) drin.
In Delphi ist das ein Funktionstyp.

Mit der Funktion AdvancedEntry uebergibt man einen Zeiger auf ein ausgefuelltes Record das in einer globalen Variablen gemerkt wird und dann verwendet wird.
Das ist eine einfache Plugin-Architektur.

Wenn es darum geht, nur so ein Record zu erstellen, damit man es mit AdvancedEntry registrieren kann, so ist das durchaus moeglich.

Delphi-Quellcode:
type
  PAdvancedDllStruct = ^AdvancedDllStruct;
  AdvancedDllStruct = packed record
    AddedFile: function(lpFileName: PChar): Integer; stdcall;
    AddedKey: function(kKeyRoot: HKEY; lpPath: PChar): Integer; stdcall;
    AddedValue: function(kKeyRoot: HKEY; lpPath: PChar; lpValueName: PChar): Integer; stdcall;
    AddShared: function(lpSharedFile: PChar): Integer; stdcall;
    BackupFile: function(lpFileName: PChar): Integer; stdcall;
    CreateDirectory: function(lpDirectory: PChar): Integer; stdcall;
    lpCommandLine: PChar;
    hbmDialog: HBITMAP;
    bSilent: LongBool;
    lpdwFlags: PDWORD;
    GetVariableString: function(lpVariable: PChar): PChar; stdcall;
    GetVariableInt: function(lpVariable: PChar): Integer; stdcall;
    SetVariableString: function(lpVariable: PChar; lpValue: PChar): Integer; stdcall;
    SetVariableInt: function(lpVariable: PChar; iValue: Integer): Integer; stdcall;
  end;
Hier eingehackt, also ohne Garantie.

Jelly 12. Apr 2005 14:37

Re: C Codeschnipsel nach Delphi
 
Danke Robert... Ich werd mal heut abend, wenn ich noch dazu komm, damit rumprobieren.

Zum Hintergrund. Es geht um das Erstellen einer DLL für ein Setupprogramm, welches dort als Plugin aufgenommen werden kann. Die DLL muss dabei natürlich gewissen Anforderungen gerecht werden, damit es eingebunden werden kann.


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