MFC/CRecentFileList
От: TOPAZ23  
Дата: 27.01.16 10:24
Оценка:
Добрый вечер всем. У меня возник такой неприятный момент в проекте с использованием MFC. Имеется класс, наследник от CWinApp. Имеется переопределенный метод AddToRecentFileList примерно такой:
MyClass::AddToRecentFileList(LPCTSTR lpszPathName)
{
 ...
 if (m_pRecentFileList != NULL)
    m_pRecentFileList->Add(lpszPathName);
 ...
}

на Windows 7 все работает нормально, но на Windows 8 и старше на строчке Add падает с ошибкой "access violation". Сейчас скажите, что нужно писать что-то типо того:
MyClass::AddToRecentFileList(LPCTSTR lpszPathName)
{
 ...
 if (m_pRecentFileList != NULL)
    if(WINVER >= 0x0601)
        m_pRecentFileList->Add(lpszPathName, m_pszAppID);
    else
        m_pRecentFileList->Add(lpszPathName);
 ...
}

Пробовал, во-первых, параметр m_pszAppID пустой, а во-вторых winver не определяется. Может есть какая-то функция для Windows 8 и старше для добавления в список или есть какой-то способ, подскажите пожалуйста!!!
Re: MFC/CRecentFileList
От: SаNNy Россия  
Дата: 27.01.16 11:03
Оценка:
Здравствуйте, TOPAZ23, Вы писали:

TOP>Добрый вечер всем. У меня возник такой неприятный момент в проекте с использованием MFC. Имеется класс, наследник от CWinApp. Имеется переопределенный метод AddToRecentFileList примерно такой:

TOP>
TOP>MyClass::AddToRecentFileList(LPCTSTR lpszPathName)
TOP>{
TOP> ...
TOP> if (m_pRecentFileList != NULL)
TOP>    m_pRecentFileList->Add(lpszPathName);
TOP> ...
TOP>}
TOP>

TOP>на Windows 7 все работает нормально, но на Windows 8 и старше на строчке Add падает с ошибкой "access violation". Сейчас скажите, что нужно писать что-то типо того:
TOP>
TOP>MyClass::AddToRecentFileList(LPCTSTR lpszPathName)
TOP>{
TOP> ...
TOP> if (m_pRecentFileList != NULL)
TOP>    if(WINVER >= 0x0601)
TOP>        m_pRecentFileList->Add(lpszPathName, m_pszAppID);
TOP>    else
TOP>        m_pRecentFileList->Add(lpszPathName);
TOP> ...
TOP>}
TOP>

TOP>Пробовал, во-первых, параметр m_pszAppID пустой, а во-вторых winver не определяется. Может есть какая-то функция для Windows 8 и старше для добавления в список или есть какой-то способ, подскажите пожалуйста!!!

Версию Windows надо определять с помощью IsWindows8OrGreater
Re[2]: MFC/CRecentFileList
От: TOPAZ23  
Дата: 27.01.16 12:20
Оценка:
Здравствуйте, SаNNy, Вы писали:

SNN>Здравствуйте, TOPAZ23, Вы писали:


TOP>>Добрый вечер всем. У меня возник такой неприятный момент в проекте с использованием MFC. Имеется класс, наследник от CWinApp. Имеется переопределенный метод AddToRecentFileList примерно такой:

TOP>>
TOP>>MyClass::AddToRecentFileList(LPCTSTR lpszPathName)
TOP>>{
TOP>> ...
TOP>> if (m_pRecentFileList != NULL)
TOP>>    m_pRecentFileList->Add(lpszPathName);
TOP>> ...
TOP>>}
TOP>>

TOP>>на Windows 7 все работает нормально, но на Windows 8 и старше на строчке Add падает с ошибкой "access violation". Сейчас скажите, что нужно писать что-то типо того:
TOP>>
TOP>>MyClass::AddToRecentFileList(LPCTSTR lpszPathName)
TOP>>{
TOP>> ...
TOP>> if (m_pRecentFileList != NULL)
TOP>>    if(WINVER >= 0x0601)
TOP>>        m_pRecentFileList->Add(lpszPathName, m_pszAppID);
TOP>>    else
TOP>>        m_pRecentFileList->Add(lpszPathName);
TOP>> ...
TOP>>}
TOP>>

TOP>>Пробовал, во-первых, параметр m_pszAppID пустой, а во-вторых winver не определяется. Может есть какая-то функция для Windows 8 и старше для добавления в список или есть какой-то способ, подскажите пожалуйста!!!

SNN>Версию Windows надо определять с помощью IsWindows8OrGreater

Спасибо конечно,но версию я могу определять и другими способами,тут вопросов нет, меня больше интересует что делать с функцией Add,если она валится, а m_pszAppID = "". Я не знаю нормальное это значение или нет. Повторюсь,меня интересует в большей степени функция Add для Windows 8 и старше.
Re[3]: MFC/CRecentFileList
От: SаNNy Россия  
Дата: 27.01.16 13:14
Оценка:
Здравствуйте, TOPAZ23, Вы писали:

TOP>Спасибо конечно,но версию я могу определять и другими способами,тут вопросов нет, меня больше интересует что делать с функцией Add,если она валится, а m_pszAppID = "". Я не знаю нормальное это значение или нет. Повторюсь,меня интересует в большей степени функция Add для Windows 8 и старше.


Так исходники MFC открыты, посмотрите внутри, где падает
Собственно реализация CRecentFileList лежит тут c:\Program Files (x86)\Microsoft Visual Studio XXX\VC\atlmfc\src\mfc\filelist.cpp
Отредактировано 27.01.2016 13:16 SаNNy . Предыдущая версия .
Re[3]: MFC/CRecentFileList
От: VladFein США  
Дата: 27.01.16 17:33
Оценка:
Здравствуйте, TOPAZ23, Вы писали:


TOP>...меня больше интересует что делать с функцией Add,если она валится, а m_pszAppID = "". Я не знаю нормальное это значение или нет. Повторюсь,меня интересует в большей степени функция Add для Windows 8 и старше.


Какая версия студии?
У меня в 2013 сгенерирован код:

CMFCApplication1App::CMFCApplication1App()
{
...
    // TODO: replace application ID string below with unique ID string; recommended
    // format for string is CompanyName.ProductName.SubProduct.VersionInformation
    SetAppID(_T("MFCApplication1.AppID.NoVersion"));

    // TODO: add construction code here,
    // Place all significant initialization in InitInstance
}


Если этого вызова нет, void CWinApp::SetCurrentHandles() (в appinit.cpp) пытается загрузить эту строку из ресурсов:
if (AfxLoadString(AFX_IDS_APP_ID, szAppID) != 0)
...

В любом случае, эта строка передаётся в void CRecentFileList::Add(IShellItem* pItem, LPCTSTR lpszAppID) (в filelist.cpp как сказал SаNNy выше), где она напрямую НЕ использутся, а передаётся в SHAddToRecentDocs(), куда я не смог step into...

Application User Model IDs (AppUserModelIDs)
Re: MFC/CRecentFileList
От: Evgeniy Skvortsov Россия  
Дата: 29.01.16 13:38
Оценка: +1
Здравствуйте, TOPAZ23, Вы писали:


TOP>Пробовал, во-первых, параметр m_pszAppID пустой, а во-вторых winver не определяется. Может есть какая-то функция для Windows 8 и старше для добавления в список или есть какой-то способ, подскажите пожалуйста!!!


Скорее всего стоит старый СДК (или как он там называется сейчас)
Видимо структура поменялась для новых версий винды, а заголовки и либ файлы старые, вот и падает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.