#include <stdio.h> #include <windows.h> char buffer[10]; int main(int argc,const char** argv) { sprintf(buffer,"hello"); HMODULE mod = GetModuleHandle("msvcrt.dll"); } Почему функция GetModuleHandle не находит модуль msvcrt.dll(GetModuleHandle возвращяет ноль)?Если запустить код в цикле и посмотреть в Process Explorer(sysinternals.com) то видно что библиотека msvcrt.dll загружена в адресное пространство процесса.Модуль kernel32.dll находится без проблем.
Не работает.ПОясню зачем мне это надо.Необходимо использовать в masm32 функции printf,stcpy и прочие для работы со строками.Я так понимаю нужно получить хэндл модуля,затем вызвать GetProcAddress.В принципе можно загрузить модуль(LoadLibrary) тогда GetModuleHandle возвращает хэндл.Странно.
а статический импорт обычный использовать никак? кстати учти, что printf и другие функции ввода вывода просто так не заработают. там надо будет дернуть __io_init кажется, которая автоматически вызывается из mainCRTStartup, но у тебя придется вызывать ее явно
The GetModuleHandle function returns a module handle for the specified module if the file has been mapped into the address space of the calling process. Это так, к слову. The LoadLibrary function maps the specified executable module into the address space of the calling process. Словарь в помощь.
>>The GetModuleHandle function returns a module handle for the specified module if the file has been mapped into the address space of the calling process Функция GetModuleHandle возвращает описатель на заданный модуль если файл был промаппирован в адресное пространство вызывающего процесса. Вызывающий процесс это моя программа.msvcrt.dll загружен в ее адресное пространство.Это видно в в Process Explorer.И вабще она всегда наверно грузится как ntdll.dll или kernel23.dll. >>А GetLastError что говорит? Cannot find specified module. >>Дамп загрузчика в студию Загрузчик это моя программа? Как сделать ее дамп не очень понимаю.Дамп это по идее описание всего что в памяти программы лежит?Это в OllyDebug можно сделать?
KingT Во-первых, с чего Вы вообще взяли, что эта dll там должна быть? Во-вторых, если Process Explorer показывает, что она действительно там есть, то это не означает, что она там есть на момент вызова GetModuleHandle. Возможно msvcrt.dll подгружается позже какой-нибудь неродной dll.
KingT функции CRT есть в инклудах для статического импорта и идут в стандартной поставке с masm32 начиная с 9й версии. Почему не возвращается хэндл легко проверить. Выведите MessageBox перед вызовом GetModuleHandle и посмотрите есть ли на тот момент msvcrt.dll в процессе. Если умеете пользоваться отладчиком то еще проще, можно посмотреть стоя перед вызовом GetModuleHandle список загруженых модулей. Это заблуждение. Всегда грузятся лишь те DLL, которые нужны загрузчику, функции CRT загрузчику никак не нужны, скорее наоборот это для msvcrt.dll нужны ntdll.dll или kernel32.dll Наиболее вероятная ситуация в вашем случае это: