【问题标题】:how to use getProcAddress() without type cast?如何在没有类型转换的情况下使用 getProcAddress()?
【发布时间】:2014-04-05 15:51:08
【问题描述】:

我正在尝试使用 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 中获得良好的价值吗?我怀疑铸造(或不铸造)与您的问题无关,所以我想知道您为什么要问这个问题?我猜您的问题是您要求GetProcAddress() 解析模块未导出的名称。
  • @MichaelBurr:我用这个函数给直接变量名加上强制转换然后我得到了值但没有强制转换我没有得到。在这个模块中,我的问题是你所理解的
  • 顺便说一句,您至少应该提交格式正确的代码。
  • @A_Gupta:如果您有一个工作示例,其中包含您想要摆脱的演员表,您应该将它与您尝试移动到的非工作代码一起发布。此外,您应该尝试发布尽可能接近可编译的代码。例如,您发布的do/while(或if)声明格式不正确。

标签: c++ c dynamic


【解决方案1】:

好吧,您的 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 },
};

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

【讨论】:

  • Meta_info_file 只不过是从 .map 文件中提取所有变量,只包含编译时地址和变量名称。
  • 好的,但是那是根据调试信息生成的,不是DLL导出符号,对吧? (使用dumpbin /exports myfile.exe 检查导出了哪些符号)
  • 然而,更重要的是,你想做什么?您的问题对于您实际想要实现的目标含糊不清 - 这是一个典型的 XY 问题,您认为 X 是正确的解决方案,因此问“为什么 X 不适合我?”,当你应该问“我如何解决问题 Y?”,我们也许可以想出更好的解决方案。
  • 是的,dumpbin 是 Visual Studio 编译器的一部分(至少在 2005 和 2010 版本中,这是我用过的)
  • 它列出了您的 .exe 或 .dll 正在导出的符号。这就是它与 .map 文件不同的原因——这是我的观点。
猜你喜欢
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
相关资源
最近更新 更多