Как найти родительский исполняемый файл библиотеки DLL изнутри библиотеки?

Мне нужно кое-что сделать с 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, чтобы найти его идентификатор; Но я использую обычное перечисление процессов из снимка, чтобы в первую очередь найти идентификатор родительского процесса)

6
задан Himanshu 30 July 2015 в 11:08
поделиться