![]() |
Re: [C] Zeichenfolge aus Funktion zurückgeben
Zitat:
Code:
Diese Routine kannst du auf variable Art aufrufen, bei C++ könntest du sogar noch Defaultwerte für die Parameter angeben.
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; }
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; } |
Re: [C] Zeichenfolge aus Funktion zurückgeben
Zitat:
Er meint jetzt aber dass _T nicht gefunden wurde: Zitat:
|
Re: [C] Zeichenfolge aus Funktion zurückgeben
Habs gelöst, man muss #include <tchar.h> inkludieren. Nur bleibt meine Messagebox leer und bei printf kommt:
Zitat:
Code:
So:
#include <stdio.h>
#include <windows.h> #include <tchar.h> #include "MpuTools.h" 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); MessageBoxW(0, SysErrorMessage(5, NULL, 0), L"Test", 0); return 0; }
Code:
Ist die erste Messagebox leer und die zweite zeigt nur viele quadrate an. :?
int main(int argc, char* argv[])
{ // Dynamischer String, aktuelle Fehlermeldung LPTSTR pszBuf; pszBuf = SysErrorMessage(0, NULL, 0); MessageBoxW(0, pszBuf, L"Test", 0); //printf(_T("%s\n"), pszBuf); LocalFree(pszBuf); // Statischer Puffer mit fester Länge, Fehlermeldung 5 TCHAR szBuf[80]; MessageBoxW(0, SysErrorMessage(5, szBuf, countof(szBuf)), L"Test", 0); return 0; } |
Re: [C] Zeichenfolge aus Funktion zurückgeben
Sorry Luckie.
1. Ich hätte für printf natürlich _tprintf nehmen müssen. Die ganzen _t-Funktionen sind auch in tchar.h definiert. 2. Das MessageBoxW sollte eigentlich nicht nötig sein. Hast du UNICODE definiert? Übersetzt du mit dem GCC oder MSC? // Nachtrag Hab einen Dreher dringehabt :oops: (kommt davon wenn man's nicht ausprobiert)
Code:
TCHAR *
SysErrorMessage (DWORD dwErrorCode, TCHAR *pszBuf, int nLenBuf) { FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | (pszBuf ? 0 : FORMAT_MESSAGE_ALLOCATE_BUFFER), NULL, dwErrorCode ? dwErrorCode : GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), pszBuf ? pszBuf : (LPTSTR)&pszBuf, pszBuf ? nLenBuf : 0, NULL); return pszBuf; } |
Re: [C] Zeichenfolge aus Funktion zurückgeben
Ah, das erklärt einiges. ;) Besten Dank.
|
Re: [C] Zeichenfolge aus Funktion zurückgeben
Die Frage ist noch als offen markiert.
Hinzufügen möchte ich auch, daß der gute Stil erfordert, daß man absolut niemals (s)printf, ebenso wie strcat, strcpy usw. benutzen sollte (auch ich halte mich nicht immer dran ...). Warum sollte bekannt sein, wenn man ab und zu die Meldungen über Verwundbarkeiten in Software verfolgt. Alle diese Funktionen achten nicht auf die Länge des Puffers - daher kommt es gehäuft beim Einsatz dieser Funktionen zu Sicherheitslücken. Es gibt für die meisten dieser Funktionen eine Version mit Längenüberprüfung. Von der Typunsicherheit habe ich noch nichtmal geredet. Unter C++ sind sowieso die Streams vorzuziehen, da du die Typsicherheit schon während des Kompilierens gewährleistest. Ansonsten machst du nichts anderes als ein C-Programm mit einem C++-Compiler zu kompilieren ... :zwinker: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:00 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-2025 by Thomas Breitkreuz