2013-12-14 3 views
0

Пожалуйста, простите меня, если ответ на это прост, но у меня нет идеи, что вызывает это. Функция PathCombineA каким-то образом модифицирует переменную mypath. Если вы запустите программу, вы увидите, что я имею в виду. (Вы должны связать Shlwapi.lib)Почему эта строка загадочно модифицирована?

#include <Windows.h> 
#include <Shlwapi.h> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    CHAR temp[MAX_PATH]; 
    CHAR mypath[MAX_PATH]; 

    GetModuleFileNameA(NULL, mypath, MAX_PATH); 
    GetTempPathA(MAX_PATH, temp); 

    LPSTR name = PathFindFileNameA(mypath); 

    cout << mypath << endl; 

    PathCombineA(name, temp, name); 

    cout << mypath << endl; 

    getchar(); 
    return 0; 
} 

выход перед тем PathCombineA

C: \ Users \ Владелец \ Desktop \ и т.д. \ Debug \ etc.exe


выход после PathCombineA

C: \ Users \ Owner \ Desktop \ etc \ Debug \ C: \ Users \ Owner \ AppData \ Local \ Temp \ и т.д.exe


Если вы, ребята, не знаете, что происходит, скажите, пожалуйста!

Спасибо!

+0

Адрес: mypath? – KingJohnno

+0

@KingJohnno GetModuleFileNameA добавляет текущий каталог в mypath –

+0

Дайте нам выходы. – Till

ответ

1

PathFindFileNameA возвращает указатель на последнюю часть строки в mypath. Затем вы передаете этот указатель в буфер мистерии в качестве выходного параметра PathCombineA.

Если вы не хотите изменять мистификацию, вам понадобится еще один буфер для хранения вывода PathCombineA.

+0

+1 правильный ответ – Till

+0

[MSDN ref] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb773571 (v = vs.85) .aspx) предупреждает: «Неправильное использование этой функции может привести к переполнению буфера. Мы рекомендуем использовать вместо этого более безопасную функцию PathCchCombine или PathCchCombineEx ». Использование одного и того же буфера «in» и «out» не является переполнением буфера, но тем не менее подпадает под «запрос на неприятности». – usr2564301

+0

Фактически, поскольку имя указывает на то, что находится в середине буфера мистификации, имя на самом деле недостаточно велико, чтобы содержать максимальную выходную строку. Переполнение буфера, безусловно, возможно, как этот код написан. –

Смежные вопросы