我想替换特定的字符wchar_t。结果,它返回内存地址。有没有办法返回替换的WCHAR_T?
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <Psapi.h>
using namespace std;
int main()
{
wchar_t processPath[MAX_PATH];
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, 3820);
GetProcessImageFileName(hProcess, processPath, MAX_PATH);
CloseHandle(hProcess);
wchar_t * pwc;
pwc = wcsstr(processPath, L"\Device\HardiskVolume1");
wcscpy_s(pwc, 100, L"C:", 100);
wcout << processPath;
return 0;
}
谢谢
我建议您使用std :: wstring,然后是。重新定位时,使用C-弦时实际上没有一个好的'替换'函数:
LPCWSTR pwszReplace = L"string-of-interest";
std::size_t len = wcslen(pwszReplace);
std::wstring path(processPath),
std::size_t ndx = path.find(pwszReplace);
if(std::wstring::npos!=ndx)
{
path.replace(ndx, len, L"new-string");
}
std::wcout << L"path is now: " << path << std::endl;
使用GetModuleFileNameEx
Windows XP及更高版本。或QueryFullProcessImageName
用于Vista及更高的vista。
否则,您不能假设"\Device\HardiskVolume1"
总是"C:"
另请参阅此Q&amp; A:将HarddiskVolume路径转换为正常路径
首先将"Device"
更改为"\?"
:
`"\Device\HardiskVolume1\path.exe"` //to
`"\\?\HardiskVolume1\path.exe"`
wchar_t buf[MAX_PATH];
wchar_t *ptr = wcsstr(processPath, L"\Device");
if(ptr)
{
wcscpy_s(buf, L"\\?");
wcscat_s(buf, ptr + wcslen(L"\Device"));
}
现在您可以在CreateFile
中打开buf
,然后使用GetFinalPathNameByHandle
获取
`"\\?\C:\path.exe"`
请注意,如果找不到搜索字符串,则wcsstr
返回NULL
。如果找到搜索字符串并取得了成功,您最终会以完成此操作的方式覆盖processPath
。此外,wcscpy_s
是wcscpy
的安全版本。如果您不想正确使用wcscpy_s
,则只需使用wcscpy
而不使用100
之类的随机数作为参数。