【问题标题】:Replace wchar_t error return memory address替换wchar_t错误返回内存地址
【发布时间】:2017-12-09 15:27:14
【问题描述】:

我想替换一个特定的字符 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;
}

谢谢

【问题讨论】:

  • 使用 QueryFullProcessImageName() 代替它已经为您提供了 Win32 路径格式。所以没有必要做这样的替换。
  • @zett42 QueryFullProcessImageName 自 vista 起可用。它在 XP 中的意思。不起作用。这就是我选择 GetProcessImageName 的原因。问题不在于api。但是 wcscpy_s 参数。我不知道我需要在参数 2 和 4 中添加什么。

标签: c++ winapi


【解决方案1】:

我建议你先使用std::wstring,然后.replace,在使用c-strings的时候并没有真正好的'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;

【讨论】:

    【解决方案2】:

    使用GetModuleFileNameEx Windows XP 及更高版本。或 QueryFullProcessImageName 用于 Vista 及更高版本。

    否则,您不能假设"\\Device\\HardiskVolume1" 总是"C:"

    另请参阅此 SO 问答:Convert HarddiskVolume path to normal path

    首先将"\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 之类的随机数作为参数。

    【讨论】:

    • 我不想使用 getmodulefilenameex 的原因,因为我读到运行不同的位存在问题。我想使用从视觉工作室推荐的 wcsncpy_s 原因。以及如何使用 wcsncpy_s ?
    • 我不知道你为什么需要wcsncpy_s。请参阅编辑以了解如何更改字符串。另请参阅其他答案。 std::wstring 是处理字符串操作的 C++ 方式,它处理安全问题并且不易出错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2021-01-24
    相关资源
    最近更新 更多