Avatar billede jordan_ulswood Nybegynder
18. november 2004 - 10:48 Der er 2 kommentarer og
1 løsning

GetSaveFileName fejler med errorcode CDERR_MEMLOCKFAILURE

Hej!

Ja, titlen siger vel det meste. Altså, jeg vil åbne en common dialog save box, og inden det initialiserer jeg OPENFILENAME struct'en. Jeg programmerer i C, bruger WinAPI, og compiler i .NET (hvis det er relevant).

Nå, her er koden:

BOOL CALLBACK DlgOptions(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
    char logFileName[500];
   
    OPENFILENAME logFile;
    logFile.lStructSize = sizeof(OPENFILENAME);
    logFile.hwndOwner = hwnd;
    logFile.lpstrFilter = NULL;
    logFile.lpstrCustomFilter = NULL;
    logFile.nFilterIndex = 1;
    logFile.lpstrFile = logFileName;
    logFile.lpstrFileTitle = NULL;
    logFile.lpstrInitialDir = NULL;
    logFile.lpstrTitle = "What to save the log file as?";
    logFile.Flags = OFN_CREATEPROMPT |OFN_HIDEREADONLY |OFN_NOREADONLYRETURN |OFN_OVERWRITEPROMPT |OFN_PATHMUSTEXIST;
    logFile.lpstrDefExt = "txt";

    switch(Message)
    {
        case WM_INITDIALOG:
            return TRUE;
            break;
       
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case IDC_OPTIONS_FILESAVEAS:
                    GetSaveFileName(&logFile);
               
                    switch( CommDlgExtendedError() )
                    {
                        case CDERR_MEMALLOCFAILURE:
                            MessageBox(NULL, TEXT("CDERR_MEMALLOCFAILURE"), "Fail", MB_OK | MB_ICONEXCLAMATION);
                            break;
                    }
                    break;
                }
            break;

        case WM_CLOSE:
            EndDialog(hwnd,0);
            break;
       
        default:
            return FALSE;
    }
    return TRUE;
}


Det er med vilje at jeg kun har en case på CDERR_MEMLOCKFAILURE når jeg switch'er på CommDlgExtendedError(). Jeg har prøvet at switch'e på alle de mulige fejlkoder som den kan finde på at retunerer, og derved fundet ud af at det er CDERR_MEMOCKFAILURE, som er fejlen. Så vidt, så godt. Derefter gik jeg ind på msdn, og læste, at CDERR_MEMLOCKFAILURE returneres når:
"The common dialog box function was unable to lock the memory associated with a handle."
OK, men hvordan løser jeg så problemet? Hvad skal der gøres for at kunne "låse hukommelsen"?

Håber det giver mening? Ellers må jeg prøve at forklare mig bedre :)

Hilsen Jesper
Avatar billede jordan_ulswood Nybegynder
18. november 2004 - 11:07 #1
Det var vist lidt noget vrøvl jeg fik skrevet. Det er CDERR_MEMALLOCFAILURE som jeg får. (CDERR_MEMLOCKFAILURE var en anden fejl jeg fik, men er gået væk nu, og blevet afløst af CDERR_MEMALLOCFAILURE)
Avatar billede jordan_ulswood Nybegynder
18. november 2004 - 11:19 #2
Jeg har nu tilføjet linien:

logFile.nMaxFile = maxFile;

,hvor maxFile deklareret som:
char maxFile[500];

Dette bevirkede at den ikke kommer med nogen fejlbeskeder, men blot tænker lidt og så sker der ikke noget mere. :/
Avatar billede jordan_ulswood Nybegynder
18. november 2004 - 12:04 #3
Jeg har fået det til at virke nu :)
Problemet var at bufferen logFileName som passes til logFile.lpStrFile SKAL starte med et NULL. Så jeg snupper selv svaret igen, undskyld ulejligheden :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester