Я нашел 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; }
Спасибо. Я уверен, что это простой вопрос.
Если DLL находится на том же пути, что и исполняемый файл, тогда исполняемый файл должен иметь возможность найти его без полного пути. В противном случае и если DLL, как известно, является общесистемной (возможно, если вы не используете Windows DLL), для вашего приложения потребуется полный путь или относительный путь. –
Поскольку он говорит «или адрес в модуле», что заставляет меня думать, что это может быть адрес любой функции в модуле. Итак, сделайте void Foo() {}, затем передайте & Foo и добавьте GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS в параметр dwFlags. –
@DavidPeterson Итак, мне нужно знать путь к DLL, чтобы вызвать функцию, которая сообщит мне путь к DLL? Кажется немного странным, поэтому, возможно, это применимо только к DLL-файлам Windows, а не к пользователям DLL. –