为什么 wchar_t* 变量会被破坏?
Why is a wchar_t* variable being clobbered?
我正在使用以下代码段。DLLName 属于wchar_t*
型,它在我的程序早期就被设置了。在我在我的代码中达到这一点之前,DLLName 是 DLL 的有效路径,如L"C:\Windows\System32\advapi32.dll"
wprintf(L"Location: %sn", DLLName);
HMODULE hDLL = LoadLibraryW(DLLName);
当我的代码达到wprintf
时会发生什么?不会打印 DLLName 的值。事实上,DLLName 现在是一个空白字符串,L""
!这会导致调用LoadLibraryW()
失败。
奇怪。我评论掉wprintf
.当调试器到达LoadLibraryW()
时,DLLName 是正确的宽字符串,带有我的 DLL 的路径。LoadLibraryW()
后,DLLName 的值为L"x4"
,调用失败。
这是怎么回事?我对如何调试它一无所知。
编辑:我所有的代码
BOOL FindOriginalCOMServer(wchar_t* GUID, wchar_t** DLLName)
{
HKEY hKey;
HKEY hCLSIDKey;
wchar_t name[MAX_PATH];
DWORD nameLength = MAX_PATH;
wprintf(L"[*] Beginning search for GUID %sn", GUID);
LONG lResult = RegOpenKeyExW(HKEY_LOCAL_MACHINE, (LPCWSTR)L"SOFTWARE\Classes\CLSID", 0, KEY_READ, &hKey);
if (lResult != ERROR_SUCCESS) {
wprintf(L"[-] Error getting CLSID pathn");
return FALSE;
}
// Make sure HKLMSoftwareClassesCLSID{GUID} exists
lResult = RegOpenKeyExW(hKey, GUID, 0, KEY_READ, &hCLSIDKey);
if (lResult != ERROR_SUCCESS) {
wprintf(L"[-] Error getting GUID pathn");
RegCloseKey(hKey);
return FALSE;
}
// Read the value of HKLM's InProcServer32
lResult = RegGetValueW(hCLSIDKey, (LPCWSTR)L"InProcServer32", NULL, RRF_RT_ANY, NULL, (PVOID)&name, &nameLength);
if (lResult != ERROR_SUCCESS) {
wprintf(L"[-] Error getting InProcServer32 value: %dn", lResult);
RegCloseKey(hKey);
RegCloseKey(hCLSIDKey);
return FALSE;
}
*DLLName = name;
return TRUE;
}
然后:
wchar_t* DLLName = new wchar_t[MAX_PATH];
if (!FindOriginalCOMServer((wchar_t*)lplpsz, &DLLName))
{
wprintf(L"[-] Couldn't find original COM servern");
return S_FALSE;
}
wprintf("[+] Found original COM server: %sn", DLLName);
HMODULE hDLL = LoadLibraryW(DLLName);
DLLName
将指向FindOriginalCOMServer
中的本地字符数组,一旦该函数返回,该数组将不再存在。
您应该将DLLName
作为wchar_t*
传递给FindOriginalCOMServer()
(一个指针,而不是两个(,然后摆脱name
并直接使用DLLName
。 或者,您可以使用wcscpy_s()
将字符串从name
复制到DLLName
。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何在 C++ 中的 wcstok 中使用常量 WCHAR* 变量?
- 在 c++ 中输入从字符串到 wchar 变量的值
- wchar /字符变量
- c++简单的方法将宏变量转换为wchar字符串文字
- 我如何将CHAR变量复制到c++中的WCHAR变量