我有一个问题,我想传递一个uint8_t[]
数组作为参数函数指针定义为' typedef void (dangerousC)(void);另外,我正在使用Windows API头文件。
假设变量raw
是由GetProcAddress()
返回的函数指针。还假设编译器不知道foo()
的参数。
下面是完整的代码:
#include <iostream>
#include <Windows.h>
typedef void (*dangerousC)(char*);
void foo(int a) {
std::cout << a << std::endl;
}
int main() {
auto raw = (FARPROC) foo;
auto* b = new uint8_t[4];
b[0] = 74;
b[1] = 35;
b[2] = 0;
b[3] = 0;
std::cout << *(int*)b << std::endl;
auto func = (dangerousC)raw;
func(reinterpret_cast<char *>(*b));
delete[] b;
}
当我调用带有参数reinterpret_cast<char *>(*b)
的函数指针时,我只得到一个字符,这在对指针解引用时是合理的。
但我也尝试了一个指针,它不打印我想要的结果,即9034。
我怎么能使函数打印9034和完全解释字节数组为32位整型?
foo()
期望一个int
,但是你传递给它的是一个char*
。因此,您需要传入一个char*
,其值是您想要的整数,而不是指向整数的实际指针。
#include <iostream>
#include <Windows.h>
typedef void (*dangerousC)(char*);
void foo(int a) {
std::cout << a << std::endl;
}
int main() {
auto raw = (FARPROC) foo;
uint8_t b[4];
b[0] = 74;
b[1] = 35;
b[2] = 0;
b[3] = 0;
int32_t i = *reinterpret_cast<int32_t*>(b);
std::cout << i << std::endl;
auto func = reinterpret_cast<dangerousC>(raw);
func(reinterpret_cast<char*>(i));
}
在线演示通常是这样做的,正如我从你的评论中正确理解的那样,你处理字节流
int n;
std::memcpy(&n, b, sizeof(n));
func(b);