Мне нужно сделать кое-что в dll, основываясь на том, какой процесс его загрузил. Так как я относительно новичок в программировании Windows, мне нужно помочь понять, как найти исполняемый файл, который загрузил текущую DLL. До сих пор я жестко кодировал имя exe-файла, что глупее всего делать: D
1) Кто-то предложил использовать функцию GetModuleFileName()
. Но, похоже, это приводит к сбою моего приложения. (Я использовал 0 в качестве дескриптора модуля). Я не делаю ничего особенного. Я использовал следующий синтаксис
GetModuleFileName(0,&fileName,MAX_PATH)
РЕДАКТИРОВАТЬ: Я понял из здесь , что я не могу получить имя .exe с этим вызовом, поскольку он возвращает только имя DLL: (*
2) Это хорошая идея сделать это в DllMain ?? Я знаю, что DllMain не место для сложных вещей. Я также понимаю проблемы, связанные с блокировкой загрузчика. Все, что мне нужно, это найти имя родительского процесса.
Я ценю ваше время!
ДОБАВИТЬ: я пытался использовать GetProcessImageFileName после получения идентификатора родительского процесса. Я получаю ошибку нарушения доступа. При попытке отладки я заметил, что вызов openProcess оставляет мой аргумент результата (путь к файлу изображения-LPTSTR) как неверный указатель.
Код ошибки 87-НЕВЕРНЫЙ ПАРАМЕТР возвращается вызовом GetProcessImageFileName.
Но текущий идентификатор процесса является действительным идентификатором.
Вот код
LPTSTR fileName={0};
HANDLE hP=OpenProcess(PROCESS_QUERY_INFORMATION ,FALSE, processes[i]) ;
GetProcessImageFileName(hP,fileName,(DWORD)MAX_PATH+1);
Что я делаю не так ??
Спасибо
РЕДАКТИРОВАТЬ ВАЖНО:
Я обнаружил, что я пытаюсь использовать openprocess в незанятом процессе. (т. Е.) Я забыл, что мой родительский процесс, возможно, ждет меня в режиме ожидания, поскольку я синхронизирую его. Так что теперь я получил плохую новость, что я не могу открыть пустой процесс с помощью OpenProcess. Как еще я могу посмотреть на объект неактивного процесса ?? (я точно знаю, что он бездействует, потому что не смог найти его в моментальном снимке. Мне пришлось использовать enumerateprocess, чтобы найти его идентификатор; но я использую обычное перечисление процессов из моментального снимка, чтобы сначала найти идентификатор родительского процесса)