Einzelnen Beitrag anzeigen

Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#11

Re: [C] Zeichenfolge aus Funktion zurückgeben

  Alt 13. Sep 2006, 14:04
Zitat von Luckie:
Ah, ja die Version von ste_ett funktioniert und ich habe sie verstanden.
Ok, dann muss ich wohl ein wenig erläutern

Code:
TCHAR *
SysErrorMessage (DWORD dwErrorCode, TCHAR *pszBuf, int nLenBuf)
{
  FormatMessage(
    FORMAT_MESSAGE_FROM_SYSTEM | (pszBuf ? FORMAT_MESSAGE_ALLOCATE_BUFFER : 0),
    NULL,
    dwErrorCode ? dwErrorCode : GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    pszBuf ? pszBuf : (LPTSTR)&pszBuf,
    pszBuf ? nLenBuf : 0,
    NULL);
  return pszBuf;
}
Diese Routine kannst du auf variable Art aufrufen, bei C++ könntest du sogar noch Defaultwerte für die Parameter angeben.
  • Wenn du dwErrorCode übergibst, dann liefert sie die Beschreibung eben dafür, ansonsten für den letzten aufgetretenen Fehler (GetLastError()) (das Konstrukt "a ? b : c" bedeutet "wenn a <> 0 dann b sonst c").
  • Wenn du einen Puffer bereitstellst und in pszBuf übergibst, dann nimmt er den (und nLenBuf), ansonsten lässt er FormatMessage den Speicher selbst belegen.
  • Der Rückgabewert ist ein TCHAR *, damit du die Funktion direkt als Argument für MessageBox o.ä. benutzen kannst.
Beispiel:
Code:
#define countof(X) (sizeof(X) / sizeof(X[0]))

int
main (int argc, char **argv)
{
  // Statischer Puffer mit fester Länge, Fehlermeldung 5
  TCHAR szBuf[80];
  printf(_T("%s\n"), SysErrorMessage(5, szBuf, countof(szBuf)));

  // Dynamischer String, aktuelle Fehlermeldung
  LPTSTR pszBuf;
  pszBuf = SysErrorMessage(0, NULL, 0);
  printf(_T("%s\n"), pszBuf);
  LocalFree(pszBuf);

  return 0;
}
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat