Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > GetSaveFileName()


Автор: Belous 31.1.2017, 15:47
Задача наверное простая, как вернуть название выбранного файла?

Код


namespace e
{
    char *filename;
}

// ...
        case IDM_SAVE_AS:
            e::filename = NULL;
            FormSaveAsFile(hwnd, e::filename);
            MessageBox(hwnd, e::filename, "Message", MB_OK);
            break;
// ...

void FormSaveAsFile(HWND hwnd, char *fname)
{
    OPENFILENAME ofn;
    char filename[MAX_PATH];
    filename[0] = 0;
    memset(&ofn, 0, sizeof(OPENFILENAME));
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hwnd;
    ofn.lpstrFilter = "Text files (*.txt)\0*.txt\0";
    ofn.lpstrFile = filename;
    ofn.nMaxFile = sizeof(filename);
    ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
    ofn.lpstrDefExt = "txt";
    if (GetSaveFileName(&ofn))
    {
        strcpy(fname, ofn.lpstrFile);
        MessageBox(hwnd, "SAVE_FILE OK", "Message", MB_OK);
    }
    else
    {
        strcpy(fname, ofn.lpstrFile);
        MessageBox(hwnd, "SAVE_FILE Cancel", "Message", MB_OK);
    }
}




Добавлено @ 15:51
В этой строке ошибка при выполнении программы
Код

strcpy(fname, ofn.lpstrFile);


Unhandled exception at 0x004021a2 in Scheme.exe: 0xC0000005: Access violation writing location 0x00000000.

Автор: Belous 31.1.2017, 16:45
Нашел решение:

вместо
Код

e::filename = NULL;

нужно
Код

e::filename = new char[MAX_PATH];



Автор: xvr 1.2.2017, 11:21
И откуда такое повальное увлечение - втыкать везде (к месту и не к месту) new/malloc/GlobalAlloc и пр?  smile 

Так не проще, а ?
Код

namespace e
{
    char filename[MAX_PATH];
}


Автор: borisbn 1.2.2017, 16:56
Если у Вас не Си, а Си++ (а судя по namespace и new у Вас именно он), то настоятельно рекомендую использовать std::string:
Код

#include <string>
// ...
namespace e
{
    std::string filename;
}
// ...
void FormSaveAsFile(HWND hwnd, std::string & fname)
{
// ...

а вместо
Код

strcpy(fname, ofn.lpstrFile);

просто копировать:
Код

fname = ofn.lpstrFile;


Повторю, это только, если у Вас не Си.

Автор: Belous 6.2.2017, 21:35
Цитата

namespace e
{
    char filename[MAX_PATH];
}

xvr
Действительно проще, к этому я и пришел, методом проб и ошибок.

Цитата

настоятельно рекомендую использовать std::string

borisbn
Мне уже даже начало нравиться работать не со строками, а с массивами символов.

Всем спасибо за советы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)