C++ 替换wchar\t错误返回内存地址

C++ 替换wchar\t错误返回内存地址,c++,winapi,C++,Winapi,我想替换特定字符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(

我想替换特定字符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;
}
#包括“stdafx.h”
#包括
#包括
#包括
使用名称空间std;
int main()
{
wchar_t processPath[最大路径];
HANDLE hProcess=OpenProcess(PROCESS\u QUERY\u INFORMATION,FALSE,3820);
GetProcessImageFileName(hProcess、processPath、MAX_PATH);
CloseHandle(hProcess);
wchar_t*普华永道;
pwc=wcsstr(processPath,L“\\Device\\HardiskVolume1”);
wcscpy_s(普华永道,100,L“C:,100);

wcout我建议您使用std::wstring,然后使用.replace,在使用c字符串时,没有真正好的“replace”函数:

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;
LPCWSTR pwszReplace=L“兴趣字符串”;
标准:尺寸长度=wcslen(pwszReplace);
std::wstring路径(processPath),
std::size\u t ndx=path.find(pwszReplace);
if(std::wstring::npos!=ndx)
{
替换(ndx,len,L“新字符串”);
}

std::wcout使用
GetModuleFileNameEx
WindowsXP及更高版本。或
QueryFullProcessImageName
用于Vista及更高版本

否则,不能假定
\\Device\\HardiskVolume1“
始终
”C:

另见本SO问答:

首先将
“\Device”
更改为
“\\?”

现在您可以在
CreateFile
中打开
buf
,然后使用
GetFinalPathNameByHandle
获取

`"\\\\?\\C:\\path.exe"`

请注意,如果未找到搜索字符串,
wcsstr
将返回
NULL
。如果找到搜索字符串并成功复制,则最终会以覆盖
processPath
的方式结束。此外,
wcscpy\u
wcscpy
的安全版本。如果不想使用
wcscpy\u
correc然后只需使用
wcscpy
,而不使用像
100
这样的随机数作为参数。

使用它,它已经为您提供了Win32路径格式。因此无需进行这样的替换。@zett42 QueryFullProcessImageName从vista开始就可用。它的意思是在XP中。它将不起作用。这就是我选择GetProcessImageNa的原因我。问题不是api。而是wcscpy_的参数。我不知道我需要在参数2和4中添加什么。我不想使用getmodulefilenameex的原因正如我所读到的,不同的位运行有问题。我想使用wcsncpy_的原因是从visual studio推荐的。以及如何使用wcsncpy_?我不知道为什么需要 > WCSncPyys。参见如何更改字符串的编辑。参见其他答案。<代码> STD::WString 是处理字符串操作的C++方式,它负责安全性问题,并且不易出错。
`"\\\\?\\C:\\path.exe"`