如何在没有类型转换的情况下使用getProcAddress()?

时间:2014-03-04 08:18:32

标签: 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); 

谢谢

1 个答案:

答案 0 :(得分:1)

嗯,您的ptr为NULL,因为您没有找到该名称。这与铸造完全无关。 (例如,你可能不得不使用DLLExport和其他东西来使你的符号可见)如果这是你的问题,那么我们就完成了。 [顺便说一句,在您的示例中,buff看起来像一个局部变量。根据定义,它们不能从DLL导出,因为当函数“处于活动的callstack”中时,这种变量才可用。您无法将符号导出到导出它们时不存在的变量...

但我怀疑你问“我能否找到符号,我该如何使用它”。

简短的回答是“你做不到”。

很长的答案是“你不能那样做”,但有一点可能的解决方案。您必须以某种方式在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 },
};

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