gpt4 book ai didi

c++ - 获取不知道位置的 .exe 目录中列出的所有文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:31 25 4
gpt4 key购买 nike

我想我的问题是这样的 - 我如何将 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");
}

它会返回目录中列出的文件而不会出错。我知道我的代码已经在给定的目录下运行,我已经对其进行了测试。

最佳答案

关键是要用GetModuleFileName() (将 nullptr 作为模块句柄传递,以引用当前进程 EXE),然后调用 PathRemoveFileSpec() (或 PathCchRemoveFileSpec(),如果您不关心 Windows 8 之前的 Windows 版本)从路径中删除文件规范。

要使用 PathRemoveFileSpec(),您必须链接 Shlwapi.lib,如 MSDN documentation 中所述.

以这段可编译代码为例:

#include <iostream>     // For console output
#include <exception> // For std::exception
#include <stdexcept> // For std::runtime_error
#include <string> // For std::wstring
#include <Windows.h> // For Win32 SDK
#include <Shlwapi.h> // For PathRemoveFileSpec()

#pragma comment(lib, "Shlwapi.lib")

// Represents an error in a call to a Win32 API.
class win32_error : public std::runtime_error
{
public:
win32_error(const char * msg, DWORD error)
: std::runtime_error(msg)
, _error(error)
{ }

DWORD error() const
{
return _error;
}

private:
DWORD _error;
};

// Returns the path without the filename for current process EXE.
std::wstring GetPathOfExe()
{
// Get filename with full path for current process EXE
wchar_t filename[MAX_PATH];
DWORD result = ::GetModuleFileName(
nullptr, // retrieve path of current process .EXE
filename,
_countof(filename)
);
if (result == 0)
{
// Error
const DWORD error = ::GetLastError();
throw win32_error("Error in getting module filename.",
error);
}

// Remove the file spec from the full path
::PathRemoveFileSpec(filename);

return filename;
}

int main()
{
try
{
std::wcout << "Path for current EXE:\n"
<< GetPathOfExe()
<< std::endl;
}
catch (const win32_error & e)
{
std::cerr << "\n*** ERROR: " << e.what()
<< " (error code: " << e.error() << ")"
<< std::endl;
}
catch (const std::exception& e)
{
std::cerr << "\n*** ERROR: " << e.what() << std::endl;
}
}

在控制台中:

C:\Temp\CppTests>cl /EHsc /W4 /nologo /DUNICODE /D_UNICODE get_exe_path.cpp
get_exe_path.cpp

C:\Temp\CppTests>get_exe_path.exe
Path for current EXE:
C:\Temp\CppTests

附言
在您的代码中,您似乎引用了 FindFirtFile() 的 Unicode 版本(即 FindFirstFileW()),因为在注释中您期望 LPCWSTR,即 const wchar_t*),但随后在以下代码中使用 ANSI/MBCS 字符串(即 char*)。

我建议您在现代 Windows C++ 代码中始终使用 Unicode UTF-16 wchar_t* 字符串:它有利于国际化,现代 Win32 API 仅随一个 Unicode 版本。

另请注意,由于您使用的是 C++,因此最好使用健壮方便的字符串类(例如,std::wstring 用于 Microsoft 的 Unicode UTF-16 字符串Visual C++),而不是类 C 的原始字符指针。在 API 接口(interface)处使用原始指针(因为 Win32 API 具有 C 接口(interface)),然后安全地转换为 std::wstring

关于c++ - 获取不知道位置的 .exe 目录中列出的所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22372896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com