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