C# 如何在MessageBox上显示FARPROC内存地址

C# 如何在MessageBox上显示FARPROC内存地址,c#,c++,c,dll,C#,C++,C,Dll,所以我试图弹出一个带有FARPROC内存地址的MessageBox,这样我就可以看到它的值。但我似乎做不到。我也试过一些古怪的东西 这是我最后一次尝试的不起作用的例子 MessageBox(NULL, (LPCSTR) (WCHAR) myFarproc, "Loader", NULL); 它只是使程序崩溃,然后 MessageBox(NULL, (LPCSTR) myFarproc, "Loader", NULL); 胡言乱语。另外值得注意的是,调用此dll代码的程序是C#。您不能将指针强

所以我试图弹出一个带有FARPROC内存地址的MessageBox,这样我就可以看到它的值。但我似乎做不到。我也试过一些古怪的东西

这是我最后一次尝试的不起作用的例子

MessageBox(NULL, (LPCSTR) (WCHAR) myFarproc, "Loader", NULL);
它只是使程序崩溃,然后

MessageBox(NULL, (LPCSTR) myFarproc, "Loader", NULL);

胡言乱语。另外值得注意的是,调用此dll代码的程序是C#。

您不能将指针强制转换为字符串,并期望某些内容清晰易读,特别是如果您将随机指针强制转换为指向C样式字符串的指针(这就是LPCSTR)

您需要做的是使用类似于
sprintf_s
的方法将指针的数值转换为字符串,并显示结果字符串

例如(从内存中,没有编译):


这是假设你可以使用SpavtfsS的C++版本。

< p>我想我做到了。我这样做对吗

size_t pAddy = (size_t) myFarproc;
stringstream ss;
char buff[10];
ss << itoa(pAddy,buff,16);
MessageBox(NULL, (LPCSTR) ss.str().c_str(), "Address", NULL);
size\u t pAddy=(size\u t)myFarproc;
细流ss;
字符buff[10];

ss将地址强制转换为
std::size\t
,并将该
std::size\t
转换为字符串。将地址强制转换为字符永远不会起作用。除非您使用的是16位程序
FARPROC
,否则它只是一个常规指针。
wsprintf()
sprintf()
(或
swprintf()
,如果您正在编译Unicode),再加上一个文本缓冲区和一行添加的代码,可能会得到您想要的结果。
istringstream
可能也会让您达到目的。为什么不使用
%p
,而不需要转换为
大小呢?没错。我会使用
intn=snprintf(缓冲区,缓冲区容量,“%p”,(void*)myFarProc)。如果
n>=sizeof buffer
,请使用realloc buffer并重试。
size_t pAddy = (size_t) myFarproc;
stringstream ss;
char buff[10];
ss << itoa(pAddy,buff,16);
MessageBox(NULL, (LPCSTR) ss.str().c_str(), "Address", NULL);