如何从dll中找到dll的父exe?

时间:2011-06-09 00:51:33

标签: c++ exe parent getmodulefilename

我需要根据加载它的进程在dll中做一些事情。因此,对于Windows编程相对较新,我需要帮助找出如何找到加载当前dll的exe。到目前为止,我一直在努力编写exe文件名,这是最愚蠢的事情:D

1)有人建议使用GetModuleFileName()功能。但这似乎崩溃了我的应用程序。(我使用0作为模块句柄)。我什么都不做。我使用了以下语法

GetModuleFileName(0,&fileName,MAX_PATH)

编辑:我从here了解到我无法通过此调用获取.exe名称,因为它只返回dll名称:(

2)在DllMain中做这个是个好主意吗?我知道DllMain不是做复杂事情的地方。我也理解与加载程序锁相关的问题。我需要的是找到父进程的名称。

感谢您的时间!

ADD:我在获取父进程ID后尝试使用GetProcessImageFileName。我收到访问冲突错误。当我尝试调试时,我注意到openProcess调用将结果参数(图像文件路径-LTTSTR)作为坏指针留下。
错误代码87-INVALID PARAMETER由GetProcessImageFileName调用返回。
 但是当前进程ID是有效的id 这是代码

LPTSTR fileName={0};  
HANDLE hP=OpenProcess(PROCESS_QUERY_INFORMATION ,FALSE, processes[i]) ;
GetProcessImageFileName(hP,fileName,(DWORD)MAX_PATH+1);

我做错了什么?

由于

编辑重要提示:

我发现我正在尝试在空闲进程中使用 openprocess。(即)我忘了我的父进程可能因为我同步它而等待空闲。所以现在我得到了一个坏消息,我无法使用OpenProcess打开一个空闲进程。 我怎样才能查看空闲进程的对象?(我肯定知道它是空闲的,因为我在快照中找不到它。我不得不使用enumerateprocess来查找它的id;但我确实使用快照中的正常进程枚举来查找父进程ID(

3 个答案:

答案 0 :(得分:3)

如果您已将fileName变量声明为char fileNamechar fileName[MAX_PATH],则可能会收到错误,因为您的参数不正确:您使用变量的地址(但是,您没有指定它是编译时错误还是运行时错误,你说它崩溃你的应用程序,所以我在这里使用Richard,你没有分配你的变量。)

我尝试了以下代码,它既可以在DLL中运行(它可以获取可执行文件的名称,也可以使用DLL模块),也可以在可执行文件本身内运行。
(注:代码根据下面的Remy评论更新,谢谢)

WCHAR exePath[MAX_PATH + 1];
DWORD len = GetModuleFileNameW(NULL, exePath, MAX_PATH);
if (len > 0) {
    wcout 
       << L"Exe path" 
       << (len == MAX_PATH) ? L" (truncated):" : L":" 
       << exePath 
       << endl;
} else {
    wcout 
       << L"Error getting exe path: " 
       << GetLastError() 
       << endl;
}

注意:如果缓冲区不够大,GetModuleFileName将截断结果并返回nSize

更多关于handling filenames in Win32

答案 1 :(得分:2)

请参阅以下link以了解有关 GetModuleFileName()

的语法和详细说明

要做的步骤:

首先使用代码获取可执行文件的完整路径:

TCHAR szEXEPath[2048];
char actualpath[2048];
GetModuleFileName ( NULL, szEXEPath, 2048 );
for(int j=0; szEXEPath[j]!=0; j++)
{
    actualpath[j]=szEXEPath[j];
}

从可执行文件的完整路径中,将字符串拆分为仅使用内置函数str.find_last_of()获取可执行文件名

std::string str (actualpath);
std::size_t found = str.find_last_of("/\\");
std::cout<< str.substr(found+1) << '\n';

现在您只能获得可执行文件名。

答案 2 :(得分:0)

我假设您使用C编码。您很可能没有为文件名分配MAX_PATH + 1个字符。