Как я могу получить путь расположения DLL внутри той же DLL в C ++? - PullRequest
0 голосов
/ 22 декабря 2011

Предположим, у меня есть dll с именем MyDll.dll

  • Он находится в d: \ MyWorks \ MyDll.dll [это директ-шоу dll]

  • Я хочу получить путь его расположения изнутри кода MyDll.

Я использовал повышениедля этого: FileSystem

string path = "";
boost::filesystem::path full_path( boost::filesystem::current_path() );
path =  full_path.string();

Но это даст мне путь его выполнения, который равен C: \ Windows \ system32 , а не путь к его местоположению, равный d.: \ MyWorks \ MyDll.dll .

Как получить местоположение dll внутри той же dll?

Обновление: По модулю Get:

TCHAR path[2048];
  GetModuleFileName( NULL, path, 2048 );
  ostringstream file;

  file << path ;

  string const pathString =file.str();

  cout << "Path: " << pathString << endl;

Дает мне просто шестнадцатеричную строку: 0049EA95 ....

Ответы [ 4 ]

5 голосов
/ 22 декабря 2011

В вашем DllMain вы получите параметр HINSTANCE;на самом деле это HMODULE вашего dll, который вы можете использовать с GetModuleFileName, чтобы получить полный путь вашего dll.Чтобы получить только каталог, в котором он находится, вам просто нужно удалить имя файла (вы можете сделать это с помощью boost::filesystem, с функциями пути оболочки, а также просто с помощью strrchr).

4 голосов
/ 22 декабря 2011

Вы можете использовать GetModuleFileName , чтобы получить полный путь к модулю.

Первый аргумент - дескриптор требуемого модуля. Если этот параметр имеет значение NULL, GetModuleFileName извлекает путь к исполняемому файлу текущего процесса.

Если вы хотите указать путь к другому модулю, вы можете использовать GetModuleHandle , чтобы получить дескриптор. Например:

  TCHAR path[_MAX_PATH+1]; 
  GetModuleFileName(GetModuleHandle(_T("MyDll.dll")), path, sizeof(path)/sizeof(path[0])); 
3 голосов
/ 22 декабря 2011

Ваша проблема пытается увидеть строку Unicode в окне вывода консоли Ansi. Если вы действительно хотите увидеть результат, вам нужно привести ваши строки к Ansi (с некоторой потерей курса), или вы можете напрямую использовать;

char path[2048];
GetModuleFileNameA(NULL, path, 2048);
cout << path;

Если вы хотите использовать Unicode, используйте TCHAR и GetModuleFileNameW (или GetModuleFileName, так как ваше приложение находится в режиме Unicode), но не пытайтесь выводить в окно консоли без приведения к Ansi.

3 голосов
/ 22 декабря 2011
TCHAR s[MAX_PATH+1];
GetModuleFileName(hInstance, s, _countof(s));

, где hInstance - это параметр DllMain.Несмотря на имя, он возвращает полный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...