2016-12-01 3 views
-2

Я пытаюсь получить путь к файлу exe в той же папке, где была эта программа. но я не мог понять, как это сделать, я сделал что-то вроде этого, но он получает только текущий путь к программе, и я не знаю, как заменить имена файлов между моей программой и программой, которую я хочу получить.Путь к исполняемому файлу в текущей папке C++

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

char fullp[MAX_PATH]; 
    char selfp[MAX_PATH] = "..//myprogram.exe"; 
    char otherprogram[MAX_PATH] = "//test.exe"; 

    DWORD szPath; 
    szPath = GetModuleFileName(NULL, selfp, sizeof(selfp)); 
+0

Если это зависит от Windows, добавьте тег winapi к вашему вопросу. – MrEricSir

+0

Для чего нужны двойные косые черты? Ни одна ОС не использует это. – stark

+0

Я использую окна, и я не знаю, почему только «//» работает на меня ... Я тестировал другие, а didint работал – Elliot

ответ

0

ФП большинство из путь там. Вот пример того, как получить остальную часть пути.

Чтобы упростить решение, я оставляю массивы char как можно дальше позади и используя std::string.

#include <iostream> 
#include <string> 
#include <windows.h> 

int main() 
{ 
    char selfp[MAX_PATH]; 
    std::string otherprogram = "Failed to get path"; 

    DWORD szPath; 
    szPath = GetModuleFileName(NULL, selfp, MAX_PATH); 
    if (szPath != 0) // successfully got path of current program 
    { 
     // helper string to make life much, much easier 
     std::string helper = selfp; 
     //find last backslash in current program path 
     size_t pos = helper.find_last_of("\\"); 

     if (pos != std::string::npos) // found last backslash 
     { 
      // remove everything after last backslash. This should remove 
      // the current program's name. 
      otherprogram = helper.substr(0, pos+1); 
      // append new program name 
      otherprogram += "test.exe"; 
     } 
    } 
    std::cout << otherprogram << std::endl; 
} 
+0

Если вы собираетесь использовать 'std :: string', вы также можете проделать весь путь и использовать Unicode-версии функций Windows API с помощью' std :: wstring', 'wchar_t' и' GetModuleFileNameW() ' , для максимального эффекта. Также обратите внимание на ответ Реми ниже (но помните о минимальных требованиях к ОС). – andlabs

+0

@ и ответ Реми не имеет минимальных требований к ОС. Эти функции shlwapi существуют с Windows 95. Документация MSDN означает минимальную * поддерживаемую ОС, как и в, минимальную ОС, на которую Microsoft будет поддерживать. Но да, согласился на 100% на использование Unicode и 'std :: wstring'. –

+0

@CodyGray Я думал, что Windows 8 представила кучу новых функций пути? Я забыл, какие из них, поэтому возможно, что ответы в Реми не являются новыми, и я не помню = P – andlabs

0

В Win32 API имеется целая куча Path Handling functions.

Например, как только вы получили полный путь вызывающего процесса из GetModuleFileName(), вы можете использовать PathRemoveFileSpec() для удаления файла, оставив только путь к папке:

char selfdir[MAX_PATH] = {0}; 
GetModuleFileNameA(NULL, selfdir, MAX_PATH); 
PathRemoveFileSpecA(selfdir); 

, а затем использовать либо PathAppend() или PathCombine() для добавления другое имя файла на этом пути:

char otherprogram[MAX_PATH] = {0}; 
lstrcpyA(otherprogram, selfdir); 
PathAppendA(otherprogram, "test.exe"); 

char otherprogram[MAX_PATH] = {0}; 
PathCombineA(otherprogram, selfdir, "test.exe"); 
+0

Будучи, поскольку это 2016 год, я я очень склонен склонить этот неверный ответ на использование API ANSI. : - \ –

+0

@CodyGray OP использовал буферы Ansi. Поскольку мы не знаем, для чего используются буферы, я не изменил их. –