OPENFILENAME lpstrFilter won't display any files

Started by
2 comments, last by Juliean 10 years, 5 months ago

Hello,

when trying to specifiy filters for my windows based file open dialog, I've encountered the problem that whathever filter I set, no files are being shown. Unless I specifiy no filter, where all files are shown like normal. The code is rather simple:


        FileDialog::FileDialog(DialogType type, const std::wstring& stTitle, LPCWSTR lpFilter): Widget(0, 0, 0, 0), m_pFileBuffer(nullptr), m_stTitle(stTitle), m_stFilter(lpFilter)
        {
            m_pFileBuffer = new wchar_t[1024];
            memset(m_pFileBuffer, 0, 1024);

            m_pNameBuffer = new wchar_t[1024];
            memset(m_pNameBuffer, 0, 1024);
            
            memset(&m_ofn, 0, sizeof(m_ofn));
            m_ofn.lStructSize = sizeof(m_ofn);
            m_ofn.lpstrFile = m_pFileBuffer;
            m_ofn.lpstrFileTitle = m_pNameBuffer;
            m_ofn.nMaxFileTitle = 1024;
            m_ofn.nMaxFile = 1024;
            m_ofn.lpstrFilter = m_stFilter.c_str();
			m_ofn.nFilterIndex = !m_stFilter.empty();
            m_ofn.lpstrTitle = m_stTitle.c_str();

			if (type == DialogType::OPEN)
				m_ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
			else
				m_ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
        }

So I'm storing the filter thats being passed in an std::wstring. Then I set the c_str() of this as the lpstrFilter. I've tried differnt filters and browsed through different directories making sure that fitting files are present:


L"Acclimate Project files(.acp)\0*.*\0" // my custom fromat I want to support, the first one I tried and lead me to belive it only didn't work for this format first
L"All\0*.*\0Text\0*.TXT\0" // only displays rubbish for the second selection (a filled out dot), and doesn't show any files for neigther of those two selections => I'm not sure if the display problem is related here, or just something else.

Any ideas what I could've missed?

Advertisement

I suspect that std::string is cutting your text short at the first \0.

A std::vector<wchar_t> or a plain old const wchar_t* might be a better option.

By the way, the format terminates with double \0 characters, not just one:

L"Acclimate Project files(.acp)\0*.*\0\0"
L"All\0*.*\0Text\0*.TXT\0\0"


L. Spiro

I restore Nintendo 64 video-game OST’s into HD! https://www.youtube.com/channel/UCCtX_wedtZ5BoyQBXEhnVZw/playlists?view=1&sort=lad&flow=grid


I suspect that std::string is cutting your text short at the first \0.



A std::vector or a plain old const wchar_t* might be a better option.

Ah, yes, that appeared to be the problem. I was already using wchar_t buffers for the others (title & file), so it isn't that hard to use here. However, I suppose there is no other option than to manually loop through the passed LPCWSTR lpFilter and check for the double \0\0 for copying the content of the buffer, since strlen & memcpy will ultimately also clamp the buffer to the first \0... or is there a simpler alternative? (I'm going to have a specific structure for setting the filters at some point anyway, but just so I know...).


By the way, the format terminates with double \0 characters, not just one:

L"Acclimate Project files(.acp)\0*.*\0\0"
L"All\0*.*\0Text\0*.TXT\0\0"


L. Spiro

I was aware of that, however I supposed that std::wstring would automatically add a \0 to the end of the string, and didn't realize it would instead cut the string of at the first \0 that there is :/

This topic is closed to new replies.

Advertisement