- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我尝试使用 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/
我是一名优秀的程序员,十分优秀!