🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

6 total messages Started by slawek Wed, 27 Apr 2016 18:43
FileOpenDialog i nieznany błąd
#308495
Author: slawek
Date: Wed, 27 Apr 2016 18:43
39 lines
2486 bytes
Mam sobie takie program w C bez plusów. A w nim, czyste API Win32, jest 
GetSaveFileName. I ten dialog zupełnie fajnie sobie działał, tj. pozwalał 
wybierać pliki itd. itp. I aby było śmieszniej, to on sobie nadal zupełnie 
dobrze działa na MS Windows 7 na przykład. I teraz zagadka: dlaczego 
GetSaveFileName wyświetla zamiast siebie taki paskudkę-dialog z tekstem 
"nieznany błąd" (po polsku) w systemie MS Windows 98SE ? Podkreślam - ten 
sam program, te samo exe. Wcześniej robiło dialog jak trzeba. Teraz pokazuje 
jakiś MessageBox że nie może pokazać. I jedyna zmiana jaka była ostatnimi 
czasy w programie to coś zupełnie innego zupełnie gdzie indziej (wywołania 
sterownika Advantech'u przez Adsapi32).

To samo robi GetOpenFileDialog. Też nie chce działać.

Jakby kogoś interesowało, to fragment programu wygląda tak jak 
Petzold/Norton przykazali:

static char szFileSaveAs[MYMAXPATH] = "";
static OPENFILENAME ofn;

if ( ofn.lStructSize == 0 )
{
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hwndOwner;
    ofn.lpstrFilter =  "Pliki danych (*.dat)\0*.dat\0"
                       "Wszystkie pliki (*.*)\0*.*\0";
    ofn.lpstrFile = szFileSaveAs;
    ofn.nMaxFile = sizeof(szFileSaveAs);
    ofn.Flags = OFN_EXPLORER
               |OFN_NOREADONLYRETURN
               |OFN_OVERWRITEPROMPT
               |OFN_PATHMUSTEXIST;
    ofn.lpstrDefExt = "dat";
}
ofn.hwndOwner = hwndOwner;

if ( GetSaveFileName(&ofn) )
{
     FileSave(hwndOwner);
}
Re: FileOpenDialog i nieznany błąd
#308496
Author: bartekltg
Date: Wed, 27 Apr 2016 19:03
32 lines
1939 bytes
On 27.04.2016 20:43, slawek wrote:
> Mam sobie takie program w C bez plusów. A w nim, czyste API Win32, jest
> GetSaveFileName.

> I teraz
> zagadka: dlaczego GetSaveFileName wyświetla zamiast siebie taki
> paskudkę-dialog z tekstem "nieznany błąd" (po polsku) w systemie MS
> Windows 98SE ?

https://msdn.microsoft.com/pl-pl/library/windows/desktop/ms646928(v=vs.85).aspx

Minimum supported client
Windows 2000 Professional [desktop apps only]
Minimum supported server
Windows 2000 Server [desktop apps only]

Pewne wyjaśnienie jest tu:
http://edn.embarcadero.com/br/article/22880
If you are compiling for Windows 2000, the OPENFILENAME structure has an 
extra 3 members that Windows 98 does not expect. Look in "commdlg.h" for 
the actual code.

> Podkreślam - ten sam program, te samo exe. Wcześniej
> robiło dialog jak trzeba.

Co to znaczy wcześniej? Na nowszym windowsie?
No to nic dziwnego, bo tam ta funkcja już zaimplementowana.
Czy działał na 98 i przestał?


pzdr
bartekltg
Re: FileOpenDialog i nieznany błąd
#308497
Author: slawek
Date: Wed, 27 Apr 2016 19:43
21 lines
1871 bytes
Użytkownik "bartekltg"  napisał w wiadomości grup 
dyskusyjnych:nfr2e5$d73$1@node1.news.atman.pl...
>>Podkreślam - ten sam program, te samo exe. Wcześniej
>> robiło dialog jak trzeba.

>Co to znaczy wcześniej? Na nowszym windowsie?
>No to nic dziwnego, bo tam ta funkcja już zaimplementowana.
>Czy działał na 98 i przestał?

Kompilowałem to MinGW32 GCC na XP i na 7, z 
opcjami -m32 -march=i586 -O3 -std=gnu99 -D_WIN32_IE=0x0500 -DWINVER=0x410.

Czyli powinno wprost i bez zastrzeżeń przyjąć.

Działało to potem z XP, 7, 10 i oczywiście z 98.

Skompilowałem kolejny raz na MS Win 7 . I przestało działać na 98. Ale nadal 
działa na 7.

Wic w tym, że "nic nie zmieniałem" - tzn. nic w okolicy robiącej koło 
otwierania plików.
Re: FileOpenDialog i nieznany błąd
#308498
Author: slawek
Date: Wed, 27 Apr 2016 20:15
29 lines
1977 bytes

Użytkownik "slawek"  napisał w wiadomości grup 
dyskusyjnych:57211650$0$698$65785112@news.neostrada.pl...

>Kompilowałem to MinGW32 GCC na XP i na 7, z 
>opcjami -m32 -march=i586 -O3 -std=gnu99 -D_WIN32_IE=0x0500 -DWINVER=0x410.

Aktualnie  jest w commdlg.h

#if (_WIN32_WINNT >= 0x0500)
    void * pvReserved;
    DWORD dwReserved;
    DWORD FlagsEx;
#endif /* (_WIN32_WINNT >= 0x0500) */

Natomiast w windef.h

#ifndef _WIN32_WINNT
#define _WIN32_WINNT WINVER

Czyli WINVER powinno wymusić odpowiedni wariant struktury OPENFILENAME i co 
tam trzeba.

Nota bene, domyślnie jest w windef.h po prostu WINVER=0x400

Tymczasem i GetOpenFileName, i GetSaveFileName, upierają się aby, w czasie 
wykonania, zamiast tego co trzeba, robić coś jakby MessageBox z napisem 
"niespodziewany błąd".
Re: FileOpenDialog i nieznany błąd
#308499
Author: Wiktor S.
Date: Tue, 03 May 2016 17:40
16 lines
1389 bytes
> Natomiast w windef.h
>
> #ifndef _WIN32_WINNT
> #define _WIN32_WINNT WINVER
>
> Czyli WINVER powinno wymusić odpowiedni wariant struktury
> OPENFILENAME i co tam trzeba.
>
> Nota bene, domyślnie jest w windef.h po prostu WINVER=0x400

Nie licz na to "domyślnie", bo gdzieś indziej coś może ci definiować.
Zdefiniuj jawnie.


-- 
Wiktor S.
Re: FileOpenDialog i nieznany błąd
#308500
Author: slawek
Date: Wed, 04 May 2016 04:44
11 lines
1524 bytes
On Tue, 3 May 2016 19:40:29 +0200, "Wiktor S." 
<wswiktorSP@Mpoczta.fm> wrote:
> Nie licz na to "domyślnie", bo gdzieś indziej coś może ci 
definiować.
> Zdefiniuj jawnie.

Ale, gdybyś uważnie czytał, to zauważył byś że było jawnie.

Problem chyba się sam rozwiązał. Wygląda na to że GCC 64-bitowe ma 
jakieś problemy ze zrobieniem dobrze 32-bitowego programu. GCC 
32-bitowe jest ok.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads