codex Temat założony przez niniejszego użytkownika |
[WinAPI, C++] Problem z przekazywaniem pointera » 2012-12-17 09:13:29 Na przykładzie prostego kodu mam kilka pytań: 1). Coś jest nie tak w miejscu przekazywania pointera dla funkcji FormatMessage ? 2). Jak się pozbyć okna konsoli widocznego podczas startu programu ? 3). Jak zdefiniować makrodefinicję dłuższą niż 1 linia (jakieś ENDM) ? 4). Na przyszłość - jak sformatować kod postu, żeby oddzielić wklejany kod od textu -nie wyświetla mi się żadna opcja do tego. Oto przykładowy kod który ma wyświetlać w MessageBoxie wartość LastError w postaci tekstowej. Problem w tym, że wyświetla mi się puste okno MessageBoxa co sugeruje, że pointer wskazuje na string lecz FormatMessage nie zapisuje pod ten sam adres ??? #define SHOWERROR ShowError() void ShowError() { LPSTR buffer; FormatMessage(( DWORD ) FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,,\ ( LPCVOID ) 0, GetLastError(),( DWORD ) LANG_NEUTRAL, buffer, 0, 0 ); MessageBox( HWND_DESKTOP, buffer, "LastError", 0 ); LocalFree( buffer ); }
int WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int nCmdShow ) { HANDLE hOpenfile = 0; hOpenfile = CreateFileW( L"D:\\PATH_NOT_EXIST\\NEWFILE.TXT", GENERIC_ALL,,\ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,,\ CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); if( hOpenfile == INVALID_HANDLE_VALUE ) SHOWERROR; if( hOpenfile ) CloseHandle( hOpenfile ); return 0; } |
|
xevuel |
» 2012-12-17 15:32:12 1). Coś jest nie tak w miejscu przekazywania pointera dla funkcji FormatMessage ? |
Przeanalizuj: FormatMessage2). Jak się pozbyć okna konsoli widocznego podczas startu programu ? |
Poszperaj w ustawieniach projektu. 3). Jak zdefiniować makrodefinicję dłuższą niż 1 linia (jakieś ENDM) ? |
4). Na przyszłość - jak sformatować kod postu, żeby oddzielić wklejany kod od textu -nie wyświetla mi się żadna opcja do tego. |
[cpp]...[/cpp] I na przyszłość - jeden problem = jeden temat :) |
|
malan |
» 2012-12-17 15:52:15 |
|
codex Temat założony przez niniejszego użytkownika |
» 2012-12-17 16:57:05 Dzięki panowie - wszystko jaśniejsze się zrobiło. Coś mi mówi, że będę miał więcej problemów z tymi typami zmiennych. Czy zawsze przy zmiennych jednakowej długości taki zapis załatwia sprawę?: ( POTRZEBNY_TYP_ZMIENNEJ ) jakis_typ_zmiennej;
A może można to wyłączyć gdzieś w opcjach kompilatora - przecież koniec końców ten LPcośtam to i tak DWORD. Zupełnie nie rozumiem celu tej całej kontroli typów w Cpp. |
|
xevuel |
» 2012-12-17 17:03:38 Czy zawsze przy zmiennych jednakowej długości taki zapis załatwia sprawę? |
Zależy od sytuacji. ten LPcośtam to i tak DWORD |
Nieprawda. LPSTR to char*, LPVOID to void*. [MSDN] Windows Data Types |
|
codex Temat założony przez niniejszego użytkownika |
» 2012-12-17 17:08:50 ??? a to zdziwiony jestem: LPSTR to wskaznik na tablicę znaków - czyli koniec końców DWORD również LPVOID, też wskaźnik czyli DWORD. Jak by nie patrzeć to obszar 4 bajtów w pamięci. Więc nie mam pojęcia (jak na razie ) po co to kontrolować... |
|
kubawal |
» 2012-12-17 17:15:38 LPVIOD to void * DWORD to tzw. dwusłowo, zależnie od komputera, ale zwykle 4 bajty, czyli unsigned long |
|
xevuel |
» 2012-12-17 17:17:10 DWORD to nie jest wskaźnik.
A 4 bajty w pamieci może zajmować zarówno int, jak i cztery chary. Czy to to samo? :) |
|
« 1 » 2 |