c++ - 如何使用 getProcAddress() 而不进行类型转换?

标签 c++ c dynamic

我尝试使用 getprocaddress 查找变量的地址。但我遇到了问题。问题是我将变量名称一一存储在 char buff[100] 中,就像在循环中一样。那时我不知道变量的类型。那么如何在没有类型转换的情况下使用它呢?我尝试使用 void * ptr 来避免类型转换。我得到 ptr 的值为零。

void *ptr;
HMODULE hdl;
char buff[100];
char word[100];
char ch1;
int     total_item=0;
META_INFO_FILE=fopen("META.txt","r");

do {

    ch1 = fscanf(META_INFO_FILE,"%s",word); 

    if ((word[0]== '_'))
    {   
        strcpy(META_buff,word+1);
        hdl = GetModuleHandle (NULL); // handle of executable
        ptr =GetProcAddress (hdl, META_buff);
        total_item++;
    } while (ch1 != EOF); 

谢谢

最佳答案

好吧,您的 ptr 为 NULL,因为您没有找到该名称。这与选角完全无关。 (例如,您可能需要摆弄 DLLExport 之类的东西才能使您的符号可见)如果这是您的问题,那么我们就完成了。 [顺便说一句,在您的示例中,buff 看起来像一个局部变量。根据定义,它们不能从 DLL 导出,因为这种变量仅当函数“在事件调用堆栈中”时才可用。您无法真正将符号导出到导出时不存在的变量...

但我怀疑您是在问“如果我能找到该符号,我该如何使用它”。

简短的回答是“你不能那样做”。

长的答案是“你不能这样做”,但有一些可能的解决方案。您必须以某种方式在 META_INFO_FILE 中对您拥有的数据类型进行编码。至少如果您想对结果调用 memcpy(ptr, somestuff, somesize) 以外的任何操作。

我还认为可能有更好的方法来做到这一点。至少如果你正在处理的是你自己的代码 - 如果你正在“修补”别人的代码,那你真是太丢脸了。

例如,您可以引入自己的符号表,其中包含有关其类型的信息等。

例如:

enum Type { CHAR_TYPE, INT_TYPE, /* more types here ... */ }
struct 
{
   char *name;
   Type type;
   char *size;
   void *ptr;
}
mysymbols [] = 
{
   { "buff", CHAR_TYPE, sizeof(buff), &buff },
   { "other", INT_TYPE, sizeof(other), &other },
};

现在,您可以搜索该列表,然后使用“开关”转换为正确的类型。

关于c++ - 如何使用 getProcAddress() 而不进行类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22166404/

相关文章:

c - 使进程在其线程中的失败中幸存下来

c - 手动设置gcc函数地址

c - system() 调用在 C 中返回错误值

c++ - 此代码显示错误 "stu undeclared"??我应该怎么办

web-services - 如何使用 Apache CXF 创建具有基本身份验证的动态 Web 服务客户端?

c++ - 如何将opencv mat图像转换为gdi位图

c++ - 简单的套接字程序偶尔会失败

c++ - 如何将比较对象或函数传递给类函数

c++ - OpenCV 用另一个值替换特定像素值

c++ - 指向动态内存结构中的变量的问题