Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#24

AW: Neustart der Applikation aus Stabilitätsgründen...

  Alt 29. Aug 2022, 17:42
Niemand hat behauptet, dass Delphi frei von Bugs sei.

Delphi 7
Delphi-Quellcode:
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,
  Directory: PAnsiChar; ShowCmd: Integer): HINST; stdcall;

function ShellExecute; external shell32 name 'ShellExecuteA';
Lazarus/FreePascal
{ascfun.inc} function ShellExecute(_para1:HWND; _para2:pchar; _para3:pchar;_para4:pchar; _para5:pchar;_para6:longint):HINST; external 'shell32name 'ShellExecuteA';
sowie
{unifun.inc} function ShellExecute(_para1:HWND; _para2:LPCWSTR; _para3:LPCWSTR; _para4:LPCWSTR; _para5:LPCWSTR;_para6:longint):HINST; external 'shell32name 'ShellExecuteW';

DevExpress (es geht auch einfacher, bzw. delphi-typischer, inkl. automatischer String-Konvertierung)
function dxShellExecute(AHandle: HWND; const AFileName: string; AShowCmd: Integer = SW_SHOWNORMAL): Boolean; overload;



Ansonsten werden natürlich für compiler-abhängige "Alias" auch die compiler-abhängigen Typen benutzt, was ja eigentlich klar sein sollte.
Code:
SHSTDAPI_(HINSTANCE) ShellExecuteA(__in_opt HWND hwnd, __in_opt LPCSTR lpOperation, __in LPCSTR lpFile, __in_opt LPCSTR lpParameters,
    __in_opt LPCSTR lpDirectory, __in INT nShowCmd);
SHSTDAPI_(HINSTANCE) ShellExecuteW(__in_opt HWND hwnd, __in_opt LPCWSTR lpOperation, __in LPCWSTR lpFile, __in_opt LPCWSTR lpParameters,
    __in_opt LPCWSTR lpDirectory, __in INT nShowCmd);
#ifdef UNICODE
#define ShellExecute ShellExecuteW
#else
#define ShellExecute ShellExecuteA
#endif // !UNICODE
Im Prinzip ist es ein Übersetzungsfehler ... da Pascal/Delphi leider keine Makros oder Funktions-Aliase kennt, hätte hier der Header besser anders übersetzt werden sollen.
Da Delphi selber aber keine Umschaltung zwischen ANSI und Unicode kann, gibt es hier nur auf der Entwicklerseite eventuelle Problemchen.

Allerdings hat es beim anderen ShellExecuteEx hier mal richtig funktioniert.
Delphi-Quellcode:
function ShellExecuteEx(lpExecInfo: PShellExecuteInfo):BOOL; stdcall;
function ShellExecuteExA(lpExecInfo: PShellExecuteInfoA):BOOL; stdcall;
function ShellExecuteExW(lpExecInfo: PShellExecuteInfoW):BOOL; stdcall;


Anders sieht es z.B. beim IShellDispatch2.ShellExecute aus, denn Dieses ist explizit ausschließlich als Unicode deklariert.
Delphi-Quellcode:
    [SID_IShellDispatch2]
    function ShellExecute(&File: WideString; vArgs, vDir, vOperation,
      vShow: OleVariant): HRESULT; stdcall;
$2B or not $2B

Geändert von himitsu (29. Aug 2022 um 17:51 Uhr)
  Mit Zitat antworten Zitat