Форум программистов, компьютерный форум CyberForum.ru

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.97
Limb0
19 / 19 / 0
Регистрация: 22.01.2012
Сообщений: 88
#1

Как правильно использовать GetModuleFileName? - C++ WinAPI

13.09.2013, 14:03. Просмотров 4647. Ответов 8
Метки нет (Все метки)

Здравствуйте, есть следующий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <Windows.h>
 
using namespace std;
 
int main ()
{   LPWSTR buffer;
    GetModuleFileName(NULL, buffer, MAX_PATH) ;
    cout<<buffer;
    cin.get();
    cin.get();
    
}
Который должен показывать полный путь откуда запускается программа. Но в VS 2012 у меня появляется ошибка:
Ошибка 1 error C4700: использована неинициализированная локальная переменная "buffer"
Что в коде не так? Можно ли как-то заменить LPWSTR на стандартный тип.

Добавлено через 43 минуты
Уже нашел ответ, нужно было просто написать wchar_t buffer[MAX_PATH]; вместо LPWSTR buffer;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2013, 14:03     Как правильно использовать GetModuleFileName?
Посмотрите здесь:

Как правильно использовать команду system? - C++ WinAPI
Добрый день.Надо в коде прописать выполнение команд командной строки. Берем команду system.Она работает. Но не понятно. 1)В...

Как правильно использовать в других языках FileWrite из WinAPI подскажите - C++ WinAPI
С++ я не знаю, в другом языке программирования нужно использовать FileWrite, но не получается (на этом форуме раздела этого языка нет, узко...

Не выводит полностью GetModuleFileName - C++ WinAPI
wstring vv; vv.resize(256); int dlina = GetModuleFileName(NULL, &amp;vv, 256); vv.erase(vv.begin() + dlina, vv.end()); ...

Некорректное возвращения значения GetModuleFileName и VirtualProtect + MessageBox - C++ WinAPI
Здравствуйте. Осваиваю использование dll. В инете нашел простенький пример использование. Но что то пошло не так... MyDLL.DLL ...

MapViewOfFile. Как наиболее быстро использовать файл как массив? - C++ WinAPI
В общем дело такое : Имею файл около 256 Мб. Необходимо юзать его как &quot;массив&quot;. Иметь возможность добавлять записи и извлекать . ...

Как использовать GetDateFormatEx - C++ WinAPI
LPCWSTR lpszBuffer = new TCHAR; LPWSTR lpStr = new TCHAR; int cch = 15; lpStr = L&quot;M//d//yyyy&quot;; cch =...

Системный таймер, как использовать? - C++ WinAPI
Есть у кого пример ? (Для того же блокнота).Везде тоьлко описание функций,а целиком работающего примера не найти. #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kidasov
77 / 77 / 12
Регистрация: 02.12.2011
Сообщений: 965
Записей в блоге: 3
13.09.2013, 14:16     Как правильно использовать GetModuleFileName? #2
C++
1
2
3
4
5
6
7
8
9
#include <windows.h>
 
WCHAR buffer[MAX_PATH];
 
int main() {
    GetModuleFileName(NULL, buffer, sizeof(buffer) / sizeof(buffer[0]));
    printf("Filepath: %ws\n", buffer);
    return 0;
}
Вот как-то так
Убежденный
Системный программист
Эксперт С++
15247 / 6879 / 1092
Регистрация: 02.05.2013
Сообщений: 11,256
Завершенные тесты: 1
13.09.2013, 15:00     Как правильно использовать GetModuleFileName? #3
Цитата Сообщение от Limb0 Посмотреть сообщение
Уже нашел ответ, нужно было просто написать wchar_t buffer[MAX_PATH]; вместо LPWSTR buffer;
Длина файлового пути, возвращаемого GetModuleFileName, может быть намного больше MAX_PATH (260).
z668
26 / 26 / 2
Регистрация: 24.03.2013
Сообщений: 239
13.03.2015, 21:04     Как правильно использовать GetModuleFileName? #4
Как же тогда корректно получить размер буфера под путь в чистом си? Или никак? Просто задавать больший размер, например 2048?
Mistik
19 / 19 / 5
Регистрация: 25.02.2015
Сообщений: 138
13.03.2015, 21:06     Как правильно использовать GetModuleFileName? #5
Цитата Сообщение от z668 Посмотреть сообщение
Как же тогда корректно получить размер буфера?
укажите размер буффера больше чем 260.
Убежденный
Системный программист
Эксперт С++
15247 / 6879 / 1092
Регистрация: 02.05.2013
Сообщений: 11,256
Завершенные тесты: 1
13.03.2015, 21:07     Как правильно использовать GetModuleFileName? #6
В Windows максимальная длина файлового пути примерно равна 32K символам.
Что мешает сразу выделить буфер с запасом ?
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
13.03.2015, 21:55     Как правильно использовать GetModuleFileName? #7
Если подойти к этому ответственно, то это будет выглядеть примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <windows.h>
#include <cstdio>
 
char * get_module_file_name( HMODULE hModule = NULL ) {
    size_t size = 1;
    char * buffer;
    for ( ; ; ) {
        buffer = new char [size + 1];
        DWORD r = GetModuleFileName( hModule, buffer, size );
        if ( r < size && r != 0 ) break;
        if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER ) {
            delete buffer;
            size += 64;
        } else return NULL;
    }
    return buffer;
}
 
int main()
{
    char * mod_name = get_module_file_name();
    if ( mod_name ) {
        printf( "%s\n", mod_name );
    } else {
        printf( "get_module_file_name(): error\n" );
    }
    return 0;
}
lod
0 / 0 / 0
Регистрация: 23.02.2016
Сообщений: 1
18.01.2017, 19:21     Как правильно использовать GetModuleFileName? #8
Позволю себе слегка усовершенствовать ваш пример

Если длина пути окажется например 2048 символов, то для его получения потребуется 32 вызова GetModuleFileName, поэтому лучше на каждой итерации удваивать буфер, а не удлинять на 64 символа, тогда хватит 11 вызовов. Также целесообразнее будет начать не с единичной длины а скажем с тех же 64 символов, это позволит сэкономить ещё 6 вызовов.

Наверно, в данном случае это ни на что не влияет, но лично мне спокойнее то что выделено через new[] освобождать через delete[].

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <windows.h>
#include <cstdio>
 
char * get_module_file_name( HMODULE hModule = NULL ) {
    size_t size = 64;
    char * buffer;
    for ( ; ; ) {
        buffer = new char [size + 1];
        DWORD r = GetModuleFileName( hModule, buffer, size );
        if ( r < size && r != 0 ) break;
        if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER ) {
            delete[] buffer;
            size *= 2;
        } else return NULL;
    }
    return buffer;
}
 
int main()
{
    char * mod_name = get_module_file_name();
    if ( mod_name ) {
        printf( "%s\n", mod_name );
    } else {
        printf( "get_module_file_name(): error\n" );
    }
    delete[] mod_name;
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2017, 21:55     Как правильно использовать GetModuleFileName?
Еще ссылки по теме:

Как использовать функцию GetDriveType? - C++ WinAPI
Добрый день. Необходимо получить тип диска. Нашел в интернете кое-какой код, но при запуске с любым типом диска консоль постоянно...

Как использовать стандартные иконки Windows - C++ WinAPI
Как загрузить в приложение стандартные иконки windows.

Как использовать переменную среды с CreateDirectory - C++ WinAPI
Здравствуйте, подскажите что я делаю не так? я хочу получить путь к системной папке Windows, пробую так: ...

Как использовать CreateFile() Для жесткого диска? - C++ WinAPI
Вообщем как мне получить handle флешки для чтения данных с неё? HANDLE handledevice; LPCTSTR NameHard=&quot;\\.\h:&quot;; ...

Как использовать одну переменную в разных процессах? - C++ WinAPI
Есть управляющая программа и программа клиент. Управляющая программа создаёт 4 клиентских программы и должна запрещать/разрешать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Убежденный
Системный программист
Эксперт С++
15247 / 6879 / 1092
Регистрация: 02.05.2013
Сообщений: 11,256
Завершенные тесты: 1
18.01.2017, 21:55     Как правильно использовать GetModuleFileName? #9
Цитата Сообщение от lod Посмотреть сообщение
Также целесообразнее будет начать не с единичной длины а скажем с тех же 64 символов, это позволит сэкономить ещё 6 вызовов.
Может быть, целесообразнее сразу выделить достаточно большой буфер (например, 32К символов),
чтобы ограничиться одним вызовом?
Yandex
Объявления
18.01.2017, 21:55     Как правильно использовать GetModuleFileName?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru