编译时出错 - 从DWORD转换为LPCVOID

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译时出错 - 从DWORD转换为LPCVOID相关的知识,希望对你有一定的参考价值。

我发现这个代码用于从中注入dll文件和调用函数。我有一个exe和源代码。 exe正在工作,但是当我尝试编译源代码时,我收到此错误:

LoadDll.cpp: In Funktion »bool ExecuteRemoteThread(HANDLE, BOOL, BOOL, wchar_t*, wchar_t*)«:
LoadDll.cpp:313:62: Fehler: ungültige Umwandlung von »DWORD (__attribute__((__stdcall__)) *)(RemoteThreadBlock*) {aka long unsigned int (__attribute__((__stdcall__)) *)(RemoteThreadBlock*)}« in »LPCVOID {aka const void*}« [-fpermissive]
In file included from c:mingwin../lib/gcc/mingw32/4.7.2/../../../../include/windows.h:50:0,
                 from LoadDll.cpp:16:
c:mingwin../lib/gcc/mingw32/4.7.2/../../../../include/winbase.h:2215:24: Fehler:   Argument 3 von »BOOL WriteProcessMemory(HANDLE, LPVOID, LPCVOID, SIZE_T, SIZE_T*)« wird initialisiert [-fpermissive]

源代码可以在:https://pastebin.com/AuZpy57U找到

似乎错误在第313行

if ( ! WriteProcessMemory( hProcess, p, &RemoteThread, 0, 0 ) )

我希望你能帮我编译一下。

答案
if ( ! WriteProcessMemory( hProcess, p, &RemoteThread, 0, 0 ) )

你必须施放第三个参数:

if ( !WriteProcessMemory( hProcess, p, reinterpret_cast<LPCVOID>(&RemoteThread), 0, 0 ) )

Update:

要摆脱undefined reference to 'WinMain@16'你应该使用

int main()
{
    int argc;
    wchar_t **argv = CommandLineToArgvW(GetCommandLineW(), &argc);

    // ...

代替

int wmain(int argc, wchar_t *argv[])
{
    // ...

以上是关于编译时出错 - 从DWORD转换为LPCVOID的主要内容,如果未能解决你的问题,请参考以下文章

C# call Win32 api时,-1如何转换为DWORD

将类成员回调从 __stdcall 转换为 DWORD_PTR

调用 MapViewOfFile 时出错

如何将 double 类型转换为 DWORDLONG 或 DWORD 转换为 DWORDLONG 或 DWORD_PTR 转换为 DWORDLONG

c++ makefile 编译出错,无法转换 main()::

从数据类型 varchar 转换为 numeric 时出错.