Windows GetModuleFileName返回的路径与GetCurrentDirectoryW(subst)不同

Windows GetModuleFileName返回的路径与GetCurrentDirectoryW(subst)不同,windows,winapi,path,getmodulefilename,Windows,Winapi,Path,Getmodulefilename,我创建了一个subst驱动器,如下所示: G:\=>F:\projects\projectname\ 当我调用GetModuleFileName时 GetModuleFileNameW(GetModuleHandleW(nullptr), buffer2, MAX_PATH); 它使用原始路径返回模块路径,例如: F:\projects\projectname\projectname.exe 尽管我从subst驱动器位置运行解决方案和项目 但是,如果我调用GetCurrentDirector

我创建了一个subst驱动器,如下所示:

G:\=>F:\projects\projectname\

当我调用GetModuleFileName时

GetModuleFileNameW(GetModuleHandleW(nullptr), buffer2, MAX_PATH);
它使用原始路径返回模块路径,例如:

F:\projects\projectname\projectname.exe
尽管我从subst驱动器位置运行解决方案和项目

但是,如果我调用GetCurrentDirectoryW

GetCurrentDirectoryW(MAX_PATH, buffer3);
它最终返回正确的路径,例如:

G:\projectname.exe

如何让GetModuleFileNameW返回子路径而不是原始路径?

这取决于在
CreateProcess
call中使用的名称-在您的情况下是
F:\projects\projectname\projectname.exe
表单。“我怎样才能得到…”不可能。反映了实现这些功能的不同层次。SUBST和GetCurrentDirectory()是子系统功能,用于获得MS Dos兼容性。一个进程一直运行到本机操作系统。它不知道有关SUBST的bean,因此无法知道重新映射是否有效。您对此无能为力。SUBST只是创建符号链接。所以这一切都取决于我们如何运行exe。如果按名称
G:\projectname.exe
-我们在
getModuleFileName
中获得了此名称,如果按名称
F:\projects\projectname\projectname.exe
-获得了此表单。与此无关的当前目录。猜测是调用
CreateProcess(“F:\projects\projectname\projectname.exe”,…,“G:\”@RbMm哦,我明白了。我误解了你。我想你是说GetModuleFileNameW永远不能返回subst驱动器,但只要CreateProcess从该驱动器调用该进程,它就可以返回。现在有道理了。谢谢@CodingMadeEasy-是的,GetModuleFileName准确返回模块加载(exe start)中使用的路径形式这取决于在
CreateProcess
call中使用的名称-在您的案例中
F:\projects\projectname\projectname.exe
使用的形式。“我怎样才能得到…”不可能。反映了实现这些功能的不同层次。SUBST和GetCurrentDirectory()是子系统功能,用于获得MS Dos兼容性。一个进程一直运行到本机操作系统。它不知道有关SUBST的bean,因此无法知道重新映射是否有效。您对此无能为力。SUBST只是创建符号链接。所以这一切都取决于我们如何运行exe。如果按名称
G:\projectname.exe
-我们在
getModuleFileName
中获得了此名称,如果按名称
F:\projects\projectname\projectname.exe
-获得了此表单。与此无关的当前目录。猜测是调用
CreateProcess(“F:\projects\projectname\projectname.exe”,…,“G:\”@RbMm哦,我明白了。我误解了你。我想你是说GetModuleFileNameW永远不能返回subst驱动器,但只要CreateProcess从该驱动器调用该进程,它就可以返回。现在有道理了。谢谢@CodingMadeEasy-是,GetModuleFileName返回模块加载(exe start)中使用的路径形式