c - 从 void * 数组获取值

标签 c winapi pointers

我正在使用一个 API (DynamoRIO) 来拦截函数调用。在函数执行之前调用wrap_find_first_file_pre方法,在函数执行之后调用wrap_find_first_file_post方法。方法签名由 API 提供。在pre方法中可以获取函数的参数,但在post方法中无法获取。 API 规定,如果需要使用 post 方法中的参数,则必须通过 OUT void **user_data 参数传递它们。

我将两个值作为 void ** OUT 参数传递,并通过 void * 参数从第二个函数访问它们。我遇到转换错误,并且不确定是否在第二个函数中以正确的方式访问值。

static void wrap_find_first_file_pre(void *wrapcxt, OUT void **user_data){
    *(user_data) = (void *)find_path; //LPCTSTR 
    *(user_data + 1) = (void *)ffd; //WIN32_FIND_DATA
}

static void wrap_find_first_file_post(void *wrapcxt, void *user_data){
    LPCTSTR find_path = (LPCTSTR) user_data[0];
    WIN32_FIND_DATA ffd = (WIN32_FIND_DATA) user_data[1];
}

最佳答案

这是一个非常标准的模式,允许您在 API 不知道您可能想要传递哪种数据的情况下传递数据。 void **user_data 不是一个 void * 数组,它只是一个 out 参数>无效*。您只能返回一个 void *

你应该做的是这样的事情:

struct my_user_data {
  LPCTSTR find_path;
  WIN32_FIND_DATA ffd;
};

static void wrap_find_first_file_pre(void *wrapcxt, OUT void **user_data) {
  my_user_data *ud = malloc(sizeof(struct my_user_data));

  ud->find_path = /* However you get this */;
  ud->ffd = /* However you get this */;

  *user_data = ud;
}

static void wrap_find_first_file_post(void *wrapcxt, void *user_data) {
  my_user_data *ud = (my_user_data *)user_data;

  /* Do something with ud->find_path and ud->ffd */

  free(ud);
}

当然,请忽略任何拼写错误等,因为我无法为您提供经过测试的代码。

关于c - 从 void * 数组获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21982226/

相关文章:

java - 使用 SWIG 在 C 上创建面向对象的 API

创建一个简单的单缓冲区应用程序 (IDirectDraw)

c++ - MsiEnumProductsEx 不工作

C如何在unsigned int指针之间进行异或

c - 在 C 中,指针和数组之间的算术如何工作?

c - 分配结构指针数组?

c - 如何使用CMake计算C项目的构建时间

c - 让 valgrind 显示常见错误

c++ - 我可以在 Win32 GUI 应用程序中使用默认控制台,还是应该创建一个新控制台?

c# - 优雅的 Win32 无窗口进程终止