以下代码:
#include <iostream>
#include <Windows.h>
using namespace std;
int main ()
{ LPWSTR buffer; //or wchar_t * buffer;
GetModuleFileName(NULL, buffer, MAX_PATH) ;
cout<<buffer;
cin.get();
cin.get();
}
Run Code Online (Sandbox Code Playgroud)
应该显示程序执行的完整路径.但是在VS 2012中我得到了错误:
使用未初始化的局部变量'缓冲区'
代码有什么问题?
在GetModuleFileName()
需要一个缓冲器和缓冲器作为输入的大小; 但是它的返回值只能告诉我们复制了多少个字符,以及大小是否足够(ERROR_INSUFFICIENT_BUFFER
).
如何确定保存整个文件名的实际所需缓冲区大小GetModuleFileName()
?
大多数人使用,MAX_PATH
但我记得路径可以超过(默认定义为260)...
(使用零作为缓冲区大小的技巧对这个API不起作用 - 我之前已经尝试过)
我需要根据已加载的进程在dll中做一些事情。因此,相对于Windows编程而言,我还是比较陌生的,我需要帮助弄清楚如何找到加载当前dll的exe。到目前为止,我一直在对exe文件名进行硬编码,这是最愚蠢的事情:D
1)有人建议使用GetModuleFileName()
功能。但这似乎使我的应用程序崩溃了(我使用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);
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么??
谢谢
编辑要点:
我发现我正在尝试在空闲进程上使用openprocess。(ie)我忘记了我的父进程可能因为我同步而可能正在等待我。因此,现在我得到了一个坏消息,即我无法使用OpenProcess打开一个空闲进程。我还能如何查看空闲进程的对象?(我肯定知道它是空闲的,因为我无法在快照中找到它。我不得不使用enumerateprocess来找到它的ID;但是我确实使用快照中的普通进程枚举来首先找到父进程ID)
如何在Chicken Scheme中可靠地获取脚本名称?
似乎-ss吃掉了脚本名称,所以除非我使用点斜杠来运行我的脚本,否则它不可见.
scriptedmain.scm:
#!/usr/bin/env csi -q
(display (command-line-arguments))
(display "\n")
(exit)
Run Code Online (Sandbox Code Playgroud)
跟踪:
$ ./scriptedmain.scm
(-q ./scriptedmain.scm)
wonko:Desktop andrew$ csi -ss scriptedmain.scm
()
Run Code Online (Sandbox Code Playgroud) scheme getmodulefilename command-line-arguments chicken-scheme
我正在尝试检查我的应用程序路径,如果它不是指定的路径,则移动它.我觉得我的代码很稳定,但它无法正常工作.
TCHAR pCheck[MAX_PATH];
TCHAR xPath[MAX_PATH];
GetModuleFileName(NULL,xPath,MAX_PATH);
if(SHGetSpecialFolderPath(HWND_DESKTOP, pCheck, CSIDL_DESKTOP, FALSE)){
wcscat(pCheck,L"\\NewFile.exe");
MessageBox(NULL,pCheck,NULL,NULL);
MessageBox(NULL,xPath,NULL,NULL);
if(pCheck!=xPath){
CopyFile(xPath,pCheck,0);
ShellExecute(0,L"open",pCheck,NULL,NULL,SW_SHOW);
return 0;
}else{
MessageBox(NULL,L"New Location",NULL,NULL);
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
即使文件在新路径中,它仍然会产生pCheck!= xPath
我从来没有得到"新位置"消息框.当显示前两个消息框时,路径是相等的...