• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы бУРов
  • Дата начала
Б

бУРов

Учусь кодит на 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)
---------------------------
Прервать Повтор Пропустить
---------------------------


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

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

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

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

rrrFer

гугл подсказывает:
Код:
#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 я не знаком.
 
L

lazybiz

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

бУРов

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

a0z

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

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

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

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

бУРов

cout << argv[0] << endl; // argv[0] - первый параметр с индексом 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" как агрумент, вместо нуля?
 
V

vol4ek88

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

rrrFer

а я вот с MFC знаком и скажу, что в коде MFC даже не пахнет.
Используется AfxGetAppName()
ссылка с MSDN:

смотрим исходный код страницы:
Код:
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="ctl00_Head1" xmlns="http://www.w3.org/1999/xhtml"><title>

AfxGetAppName (MFC)

</title>
Если погуглить - то можно найти большое количество похожих, но менее авторитетных источников.
гуглил так:
нагуглил(4 ссылка):
Основы MFC
Файл AFXWIN.H

Все MFC-программы включают заголовочный файл AFXWIN.H. В нем, а также в различных вспомогательных файлах, содержатся описания классов, структур, переменных и других объектов MFC. Он автоматически подключает большинство заголовочных файлов, относящихся к MFC, в том числе и WINDOWS.H, в котором определены все функции Windows API и другие объекты, которые используются при традиционном программировании на С и "чистом" API.
Ну я поэтому решил что все таки пахнет, но если я не прав - каюсь )
 
V

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; выведет не имя, а адрес указателя.
 
V

vol4ek88

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

Вложения

  • mfc.rar
    18,5 КБ · Просмотры: 138
L

lazybiz

кайтесь, имхо я сел за комп.
Это уже интересно.

Итак, AfxGetAppName() действительно функция MFC но!
Ну вот, а говорил что не нуждаешься.

Возвращает она не имя модуля, а указатель на строку содержащую это имя.
Аа.. Ээ.. а в чем, собственно, разница?
Как заметил один человек выше ИНИЦИАЛИЗАЦИЯ MFC НЕ ВЫПОЛНЕНА. Поэтому в том коде ей даже не пахнет.
Так, вроде особо никто и не возражал кроме тебя по этому поводу... Ей на самом деле и не пахнет.

Добавлено: строка cout << AfxGetAppName() << endl; выведет не имя, а адрес указателя.
Ну тут давайте мы почитаем официальное описание функции...:
Return Value
A null-terminated string containing the application's name.
Было бы странно, если бы функция cout напечатала шестнадцатеричное значение заместо тривиальной строки, не так ли?
 
V

vol4ek88

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

lazybiz

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!