2015-03-27 3 views
0

Я нашел Get DLL path at runtime, но я не уверен, что использовать для переменной localFunc. Я пробовал имя файла DLL, я пытался использовать null и некоторые другие вещи, но возвращаемый статус всегда был «File Not Found». Из MSDN:Получить путь, где находится DLL

lpModuleName [в, по выбору] Имя загруженного модуля (DLL-либо или EXE-файл), или адрес в модуле (если dwFlags является GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS).

Поэтому я предполагаю, что они просто означают простое имя файла, например «MyControl.dll», а не путь к файлу, так как я не знаю пути. Edit: добавлена ​​фактический код:

char localFunc[MAX_PATH] 
sprintf_s(localFunc, 52, "MyActiveXComponent.dll"); 
if (!GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCSTR) &localFunc, &hm)) 
{ 
    int ret = GetLastError(); 
    OutFile << L"GetModuleHandle returned " << ret << std::endl; 
} else { 
    GetModuleFileNameA(hm, path, sizeof(path)); 
    OutFile << L"Path of dll is:" << path << L"<" << std::endl; 
} 

Вот что я закончил с (осуществляется в обоих направлениях)

LPCWSTR anotherFunc = L"MyActiveXComponents.dll"; HMODULE hm2 = GetModuleHandle(anotherFunc); // get the handle to the module LPWSTR anotherPath = new WCHAR[MAX_PATH]; GetModuleFileName(hm2, anotherPath, MAX_PATH); // get the full path OutFile << L"Path of dll is:" << anotherPath << L"<" << std::endl; Вот другой способ.

char path[MAX_PATH]; HMODULE hm = NULL; char localFunc[MAX_PATH] = {"MyActiveXComponents.dll"}; if (!GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, LPCSTR) &localFunc, &hm)) { int ret = GetLastError(); OutFile << L"GetModuleHandle returned " << ret << std::endl; } else { GetModuleFileNameA(hm, path, sizeof(path)); OutFile << L"Path of dll is:" << path << L"<" << std::endl; } Спасибо. Я уверен, что это простой вопрос.

+0

Если DLL находится на том же пути, что и исполняемый файл, тогда исполняемый файл должен иметь возможность найти его без полного пути. В противном случае и если DLL, как известно, является общесистемной (возможно, если вы не используете Windows DLL), для вашего приложения потребуется полный путь или относительный путь. –

+1

Поскольку он говорит «или адрес в модуле», что заставляет меня думать, что это может быть адрес любой функции в модуле. Итак, сделайте void Foo() {}, затем передайте & Foo и добавьте GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS в параметр dwFlags. –

+0

@DavidPeterson Итак, мне нужно знать путь к DLL, чтобы вызвать функцию, которая сообщит мне путь к DLL? Кажется немного странным, поэтому, возможно, это применимо только к DLL-файлам Windows, а не к пользователям DLL. –

ответ

3

Вызвать GetModuleHandle() с необработанным именем, например user32.dll или любым другим именем DLL. После того, как у вас есть дескриптор, вызовите GetModuleFileName(), чтобы получить полное имя, включая путь.

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