C++ 如何通过MessageBox输出指针?

C++ 如何通过MessageBox输出指针?,c++,winapi,pointers,assembly,messagebox,C++,Winapi,Pointers,Assembly,Messagebox,我有以下代码: extern "C" __declspec(dllexport) void getName(void) { char buf[20]; int slotNumber = 1; DWORD tempdw; DWORD hStorm_LOBBYPTR; hStorm_LOBBYPTR = (DWORD)GetModuleHandleW(L"Storm.dll") + 0x1000 + 0x40000 + 0x8000; __asm

我有以下代码:

extern "C" __declspec(dllexport) void getName(void)
{
    char buf[20];
    int slotNumber = 1;

    DWORD tempdw;
    DWORD hStorm_LOBBYPTR;
    hStorm_LOBBYPTR = (DWORD)GetModuleHandleW(L"Storm.dll") + 0x1000 + 0x40000 + 0x8000;


   __asm
    {
     PUSHAD
     MOV        EAX, DWORD PTR DS:[hStorm_LOBBYPTR]
     TEST       EAX, EAX
     JE         nick_false
     MOV        ECX, DWORD PTR DS:[EAX+0xC464]
     TEST       ECX, ECX
     JE         nick_false
     MOV        EAX, DWORD PTR DS:[ECX+0x170+0xB0]
     TEST       EAX, EAX
     JE         nick_false
     MOV        EDX, slotNumber
     MOV        ECX, DWORD PTR DS:[EAX+EDX*4]
     MOV        EAX, DWORD PTR DS:[ECX+0x1A0]
     MOV        ECX, DWORD PTR DS:[EAX+0x1E4]
     MOV        EAX, DWORD PTR DS:[ECX+0x1E4]
     MOV        ECX, DWORD PTR DS:[EAX+0x1E8]
     MOV        tempdw, ECX
     POPAD
     JMP        nick_true

nick_false:
     XOR        EAX, EAX
     MOV        tempdw, EAX
     POPAD
    }

    sprintf(buf,"%d", tempdw);
    MessageBox(0, buf, "Dll Injector", MB_ICONEXCLAMATION | MB_OK);
tempdw
是一个指针,但当我试图查看它时, 我在MessageBox中有这样的垃圾:


我该怎么办?

我猜您的程序集在某个地方(可能是一个寄存器)上跺脚,这意味着
sprintf
失败,缓冲区中只包含随机堆栈噪声

通过移除程序集来检查此问题。

printf
中查找“%p”打印说明符:

char temp_buffer[64];
char * p_temp_buffer = temp_buffer; // A pointer to display.
//...
sprintf(temp_buffer, "%p", (void *) p_temp_buffer);
MessageBox(0, temp_buffer, "Pointer value", MB_OK);

对于初学者,请使用
MessageBoxA
确保您使用的是ASCII版本。另外,您通常使用
%0p
作为指针的格式说明符。您说
tempdw
是指针-您应该首先声明它是指针。好了,指针的格式应该是“%x”。它看起来像一个以非空结尾的字符串,这意味着对sprintf的调用由于某种原因失败。由于不了解汇编,我无法想象它怎么会失败。MessageA没有帮助,将它声明为指针没有任何区别。可能是这样,但它无法解释问题中报告的行为。OP的问题是如何在消息框中显示指针;这就是我的回答。我倾向于不回答无法解释的行为问题。但在这种情况下,无法解释的行为就是Jugo所坚持的。