我知道之前已经问过这个问题,但我还没有看到一个令人满意的答案,或者一个明确的"不,这不可能完成",所以我再问一次!
我想做的就是以独立于平台的方式获取当前运行的可执行文件的路径,作为绝对路径或相对于调用可执行文件的位置.我虽然boost :: filesystem :: initial_path是我的麻烦的答案,但似乎只处理问题的'平台无关'部分 - 它仍然返回调用应用程序的路径.
对于一些背景,这是一个使用Ogre的游戏,我试图使用Very Sleepy进行配置,它从自己的目录运行目标可执行文件,所以当然在加载时游戏找不到配置文件等,并立即崩溃.我希望能够将它传递给配置文件的绝对路径,我知道配置文件将始终与可执行文件一起存在.在Visual Studio中进行调试也是如此 - 我希望能够运行$(TargetPath)而无需设置工作目录.
我有以下代码:
// Fetch Local App Data folder path.
PWSTR localAppData = (PWSTR) malloc(128);
SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &localAppData);
// Find out the absolute path to chrome.exe
stringstream ss;
ss << localAppData << "/Google/Chrome/Application/chrome.exe";
Run Code Online (Sandbox Code Playgroud)
stringstreamer的结果.str()
是008F6788/Google/Chrome/Application/chrome.exe
,这是错误的.
我似乎无法使用stringstreamer工作,由于类型不兼容,strcat或wcsncat也没有.
如何将此PWSTR强制转换为字符串?
我想我的问题是这样的 - 如何将exe位置的目录作为LPCWSTR获取,以便我可以将其输入到我的代码中
#include <iostream>
#include <Windows.h>
int main(int argc, char **argv)
{
WIN32_FIND_DATA a;
HANDLE swap = FindFirstFile(/*(LPCWSTR)__exe_directory__*/,&a);
if (swap!=INVALID_HANDLE_VALUE)
{
do
{
char *sptn = new char [lstrlen(a.cFileName)+1];
for (int c=0;c<lstrlen(a.cFileName);c++)
{
sptn[c]=char(a.cFileName[c]);
}
sptn[lstrlen(a.cFileName)]='\0';
std::cout<<sptn<<std::endl;
}
while (FindNextFile(swap,&a));
}
else std::cout<<"undetected file\n";
FindClose(swap);
system("pause");
}
Run Code Online (Sandbox Code Playgroud)
它会返回目录中列出的文件而不会出错.我知道我的代码已经在给定目录的情况下工作,我已经测试了它.
我刚开始在Windows 7上学习golang.
有了go env
,我得到了这个:
set GOARCH=amd64
set GOBIN=
set GOEXE=.exe
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=E:\Workbench\Go
set GORACE=
set GOROOT=C:\DevTools\Go
set GOTOOLDIR=C:\DevTools\Go\pkg\tool\windows_amd64
set CC=gcc
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0
set CXX=g++
set CGO_ENABLED=1
Run Code Online (Sandbox Code Playgroud)
然后我echo %envVar%
在命令行中查看,我找到了env vars,如:
GOPATH
GOROOT
Run Code Online (Sandbox Code Playgroud)
但是找不到其他人.
那么它们存放在哪里?一些隐藏的配置文件?