В myDLClient.c я использую LoadLibraryW () для загрузки lib2.dll, которая, в свою очередь, зависит и пытается загрузить lib1.dll.
lib1.dll может быть
1) настоящее время,
2) присутствует и не читается,
3) присутствовать и иметь пропущенные символы или быть
4) отсутствует вообще.
В случае 2) и 3) мне нужно, чтобы в моем коде отображалась дополнительная информация, а не средства отладки, такие как dumpbin или listdlls.
В моей текущей реализации, для случаев 2) и 3), GetLastError () дает мне Код системной ошибки 193. Я могу извлечь подробное сообщение, используя FormatMessage. Поэтому сообщение об ошибке 193 «% 1 не является допустимым приложением Win32». При 4) я получаю ошибку 126, соответствующую сообщению: «Указанный модуль не найден».
Я хочу больше информации в случае 2) и 3), например, полный путь к DLL, которую он пытался загрузить (lib1.dll, а не lib2.dll; GetModuleFileName () дает мне путь к lib2.dll). Если это случай 3), также сообщите мне имя отсутствующего символа.
int main(){
HINSTANCE lib2_handle;
LPCWSTR lib2_name = L"../lib2.dll";
lib2_handle = LoadLibraryW(lib2_name);
if (!lib2_handle) {
ErrorExit();
return -2;
}
return 0;
}
void ErrorExit(){
// Retrieve the system error message for the last-error code
LPVOID msgBuf;
DWORD errCode = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS, //Flags
NULL, //Source
errCode, //MsgID
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //LanguageID
(LPTSTR)&msgBuf, //BufferPointer
0, NULL); //MinimumBufferSize, Arguments
// Display the error message
printf("Process %d exitted with system error: %d\n", GetCurrentProcessId(), errCode);
printf("%s\n", (LPTSTR)msgBuf);
LocalFree(msgBuf);
}
Перечисление с использованием EnumProcessModules () неосуществимо, потому что процесс myDLClient.exe может содержать тысячи модулей, и сравнение их со списком модулей в lib2.dll займет много времени. (Я могу ошибаться, поправьте меня, если я неправильно понял этот подход.)
Я нашел RtlGetUnloadEventTraceEx () , но я не знаю, ищу ли это. Я также был бы признателен за пример кода, поскольку я не могу найти ни одного. ( Вопрос по стеку )
Я также наткнулся на C Функции времени выполнения и Функции Sym в dbghelp.h ( Проверьте это тоже ), но не смог понять, как использовать их.
Я воздержался от упоминания деталей внутри двух библиотек, потому что я думаю, что это не имеет значения, поскольку мы знаем, что lib2.dll зависит от lib1.dll и что lib2.dll всегда будет там в правильной форме, но lib1 .dll может быть неправильным / отсутствовать в соответствии с упомянутыми ранее случаями. Хотя, если вам нужно, чтобы я опубликовал код DLL или списки экспорта / импорта, дайте мне знать, и я могу это сделать.