如何从dll中找到dll的父exe



我需要根据加载dll的进程在dll中做一些事情。因此,作为windows编程的新手,我需要帮助找出如何找到加载当前dll的exe。到目前为止,我一直在硬编码exe文件名,这是最愚蠢的事情:D

1) 有人建议使用CCD_ 1函数。但这似乎让我的应用程序崩溃了。(我使用0作为模块句柄)。我没有做什么花哨的事。我使用了以下语法

GetModuleFileName(0,&fileName,MAX_PATH)

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

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

感谢您抽出时间!

附加:在获取父进程ID后,我尝试使用GetProcessImageFileName。我遇到访问冲突错误。当我尝试调试时,我注意到openProcess调用将我的结果参数(图像文件路径LPTSTR)作为一个坏指针
GetProcessImageFileName调用返回错误代码87-INVALID PARAMETER
但当前进程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)

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

我尝试了以下代码,它既可以在DLL中工作(它获得可执行文件的名称,而不是DLL模块),也可以在可执行文件本身中工作
(注意:代码根据雷米的评论更新,谢谢)

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

有关在Win32中处理文件名的详细信息。

请参阅下面的链接,了解有关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';

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

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

相关内容

  • 没有找到相关文章

最新更新