Как Использовать Afxgetappname?

Тема в разделе "MS Visual C++", создана пользователем бУРов, 24 окт 2011.

  1. бУРов

    бУРов New Member

    Регистрация:
    24 окт 2011
    Сообщения:
    4
    Симпатии:
    0
    Учусь кодит на MS VC.
    Сваял консольное приложение.
    Хочу сделть вывод в консоль имени приложения, используя функцию AfxGetAppName.

    Код (C++):
    #include <afxwin.h>
    #include <fstream>
    #include <iostream>
    using namespace std;

    int main()
    {
    ofstream ofs("c:\\write.txt");
    cout << AfxGetAppName() << "WritData: Press Key and Enter for access to file " << endl;
    return 0;
    }
    Компиляция проходит, открывается окно консоли и но получаю ошибку выполнения:

    ---------------------------
    Microsoft Visual C++ Debug Library
    ---------------------------
    Debug Assertion Failed!

    Program: ...ты\Kryukov\prj\VS2008\Hello W32\TestMutex\Debug\WriteData.exe
    File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin1.inl
    Line: 29

    For information on how your program can cause an assertion
    failure, see the Visual C++ documentation on asserts.

    (Press Retry to debug the application)
    ---------------------------
    Прервать Повтор Пропустить
    ---------------------------


    Если "Прервать", в окне строчка

    "Для продолжения нажмите любую клавишу . . ."

    и окно закрывается.

    Почему так?
    Почему функция не срабатывает?
     
  2. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    гугл подсказывает:
    Код (Text):
    #include <windows.h>
    #include <string>
    #include <iostream>

    int main( ) {
    char        szAppPath[MAX_PATH] = "";
    std::string strAppName;

    ::GetModuleFileNameA(0, szAppPath, MAX_PATH);

    // Extract name
    strAppName = szAppPath;
    strAppName = strAppName.substr(strAppName.rfind("\\") + 1);

    std ::cout << strAppName << std ::endl;
    return 0;
    }
    тока тут вместо AfxGetAppName используется GetModuleFileNameA, т.к. с MFC я не знаком.
     
  3. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Почему тот код выдает ошибку я не знаю, и с MFC тоже не знаком, зато я знаю как проще всего получить полное имя приложения не используя никаких функций.
    Код (C++):
    int main( int narg, char *argv[] )
    {
    cout << argv[0] << endl; // argv[0] - первый параметр с индексом 0 - это и есть имя приложения.
    return 0;
    }
     
  4. бУРов

    бУРов New Member

    Регистрация:
    24 окт 2011
    Сообщения:
    4
    Симпатии:
    0
    Зачем тогда такие функции вводят, если и без них можно ((
     
  5. a0z

    a0z Well-Known Member

    Регистрация:
    15 мар 2011
    Сообщения:
    109
    Симпатии:
    0
    Насколько я помню, AfxGetAppName может возвращать не только имя exe файла, но и имя DLL, если оно (MFC приложение) там расположено. Хотя могу ошибаться, но там была какая-то замануха AFX_MANAGE_STATE

    А вот GetModuleFileNameA точно может путь к любому модулю - на какой дашь хендл, а не только к exe

    А по поводу, почему AfxGetAppName не работает - потому что MFC не инициализировано. Чё-то там надо вызвать в начале, AfxWinInit что-ли.

    Но, если argc[0] устраивает, то городить MFC незачем.
     
  6. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    В данном случае argv, но имя переменной можно дать любое.
     
  7. бУРов

    бУРов New Member

    Регистрация:
    24 окт 2011
    Сообщения:
    4
    Симпатии:
    0
    Так я вытаскиваю имя.
    Код (C++):
    string AppName = argv[0];
    AppName = AppName.substr(AppName.rfind("\\") + 1);
    AppName = AppName.substr(0, AppName.rfind("."));
    Но в последней строке мне не нравится использование нуля явно.
    Но вот в справке (basic_string::substr) читаю:

    "Copies a substring of at most some number of characters from a string beginning from a specified position.
    Код (C++):
    basic_string<CharType, Traits, Allocator> substr(
    size_type _Off = 0,
    size_type _Count = npos
    ) const;
    Parameters
    _Off
    An index locating the element at the position from which the copy of the string is made, with a default value of 0.
    _Count
    The number of characters that are to be copied if they are present."

    Можно ли использовать обозначение "_Off" как агрумент, вместо нуля?
     
  8. vol4ek88

    vol4ek88 Гость

    а я вот с MFC знаком и скажу, что в коде MFC даже не пахнет.
     
  9. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Используется AfxGetAppName()
    ссылка с MSDN:
    http://msdn.microsoft.com/en-us/library/sw...v=vs.80%29.aspx
    смотрим исходный код страницы:
    Код (Text):
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="ctl00_Head1" xmlns="http://www.w3.org/1999/xhtml"><title>

    AfxGetAppName (MFC)

    </title>
    Если погуглить - то можно найти большое количество похожих, но менее авторитетных источников.
    гуглил так: http://www.google.ru/#sclient=psy-ab&h...280&bih=878
    нагуглил(4 ссылка): http://www.codenet.ru/progr/visualc/mfc/mfc2.php
    Ну я поэтому решил что все таки пахнет, но если я не прав - каюсь )
     
  10. vol4ek88

    vol4ek88 Гость

    секундочку
     
  11. vol4ek88

    vol4ek88 Гость

    кайтесь, имхо я сел за комп. Итак, AfxGetAppName() действительно функция MFC но! Возвращает она не имя модуля, а указатель на
    строку содержащую это имя. AfxWin.h действительно содержит описание классов MFC но! Далеко не все. Как заметил один человек выше ИНИЦИАЛИЗАЦИЯ MFC НЕ ВЫПОЛНЕНА. Поэтому в том коде ей даже не пахнет.
    MFC инициализируется функцией AfxWinInit как правильно написал тот-же человек выше. Описание классов и функций в файле stdafx.h его содержание:
    Код (C++):
    // stdafx.h: включаемый файл для стандартных системных включаемых файлов
    // или включаемых файлов для конкретного проекта, которые часто используются, но
    // не часто изменяются
    //

    #pragma once

    #include "targetver.h"

    #include <stdio.h>
    #include <tchar.h>
    #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS   // некоторые конструкторы CString будут явными

    #ifndef VC_EXTRALEAN
    #define VC_EXTRALEAN            // Исключите редко используемые компоненты из заголовков Windows
    #endif

    #include <afx.h>
    #include <afxwin.h>      // основные и стандартные компоненты MFC
    #include <afxext.h>      // Расширения MFC
    #ifndef _AFX_NO_OLE_SUPPORT
    #include <afxdtctl.h>         // поддержка MFC для типовых элементов управления Internet Explorer 4
    #endif
    #ifndef _AFX_NO_AFXCMN_SUPPORT
    #include <afxcmn.h>                  // поддержка MFC для типовых элементов управления Windows
    #endif // _AFX_NO_AFXCMN_SUPPORT

    #include <iostream>


    Добавлено: строка cout << AfxGetAppName() << endl; выведет не имя, а адрес указателя.
     
  12. vol4ek88

    vol4ek88 Гость

    проект VS 2010 консольное приложение с использованием MFC в сообщении выводит своё имя (на Express работать не будет).
     

    Вложения:

    • mfc.rar
      Размер файла:
      18,5 КБ
      Просмотров:
      5
  13. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Это уже интересно.

    Ну вот, а говорил что не нуждаешься.

    Аа.. Ээ.. а в чем, собственно, разница?
    Так, вроде особо никто и не возражал кроме тебя по этому поводу... Ей на самом деле и не пахнет.

    Ну тут давайте мы почитаем официальное описание функции...:
    Было бы странно, если бы функция cout напечатала шестнадцатеричное значение заместо тривиальной строки, не так ли?
     
  14. vol4ek88

    vol4ek88 Гость

    2. я собственно не говорил что AfxGetAppName не MFC функция. Имелось ввиду сама MFC.
    3. разницы собственно никакой просто уточнение.
    4. было бы странно, написав #include <afxwin.h> включить в проект MFC.
    6. cout'ы , scanf'ы , printf'ы и т.д. это конечно к тебе, я с ними не дружу.
     
  15. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Из твоих, хаотично-разбросанных пунктов, мне удалось извлечь лишь малую долю информации, удовлетворяющую мои вопросы.
    Но для меня это не столь критично, т.к. я не задавался целью кого-то критиковать/унизать/выставить на посмешище. Мне было просто интересно узнать, откуда у тебя такие мысли.. Увы, вразумительного ответа я так и не услышал...
    А теперь пардон, я спасть. Завтра у меня трудный и долгий рабочий день.
     
Загрузка...

Поделиться этой страницей