替换WCHAR_T错误返回存储地址



我想替换特定的字符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_swcscpy的安全版本。如果您不想正确使用wcscpy_s,则只需使用wcscpy而不使用100之类的随机数作为参数。

最新更新