我需要根据加载它的进程在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(
)答案 0 :(得分:3)
如果您已将fileName变量声明为char fileName
或char 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
。
答案 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个字符。