2014-03-04 35 views
1

我嘗試使用getprocaddress查找變量的地址。但我在這方面遇到問題。問題是,我將變量的名稱存儲在char buff [100]中,如循環中一樣。那一次我不知道變量的類型。所以如何在不使用類型轉換的情況下使用它。我嘗試使用void * ptr來避免類型轉換。我得到的ptr值是零。如何在不使用類型轉換的情況下使用getProcAddress()?

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

你是說如果你使用演員陣容,你會在'ptr'中獲得很好的價值?我懷疑演員(或不演員)與你的問題無關,所以我想知道你爲什麼要問這個問題?我猜你的問題是你要求'GetProcAddress()'來解析模塊沒有導出的名字。 –

+0

@MichaelBurr:我使用這個函數來給予直接變量的名字,然後我得到了值,但沒有鑄造我沒有得到。在這個模塊中,我的問題是你明白 –

+0

你應該至少提交格式正確的代碼。 –

回答

1

那麼,你的ptr爲NULL,因爲你沒有找到名稱。這與鑄造完全無關。 (例如,您可能不得不擺弄DLLExport以及讓這些符號可見的東西)如果這是您的問題,那麼我們就完成了。 [順便說一句,在你的例子中,buff看起來像一個局部變量。根據定義,它們不能從DLL中導出,因爲這種類型的變量只有在函數「處於活動調用堆棧」時纔可用。你不能真正將符號導出到導出時不存在的變量...

但是我懷疑你是在問「如果我能找到符號,我該如何使用它」。

簡短的回答是「你不能那樣做」。

長的答案是sitll「你不能這樣做」,但有一點可能的解決方案。您必須以某種方式在您的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 }, 
}; 

現在,你可以搜索列表中,然後用「開關」投射到正確的類型。

+0

Meta_info_file不過是從.map文件中提取所有隻包含編譯時間地址和變量名稱的變量。 –

+0

好的,但是這是基於調試信息生成的,而不是DLL導出符號,對吧? (使用'dumpbin/exports myfile.exe'來檢查導出的符號) –

+2

但是,更重要的是,你想要做什麼?你的問題對於你實際想要達到的目標是模糊的 - 這是一個典型的XY問題,你認爲X是正確的解決方案,因此問「爲什麼X不適合我?」,當你應該問「我該如何解決問題Y?」,我們可能會提出一些更好的解決方案。 –

相關問題