2017-04-14 67 views
0

更新文件外部的靜態變量,而不修改C lang中聲明靜態變量的文件。從c中的另一個文件更新靜態全局變量

Proj1創建dll。 Proj1有abc.h文件,其定義如下:

static BOOl stvar = False;//declared as global static variable 

func1() 
{ 
    stvar= TRUE; 
} 

func2() 
{ 
    if(stvar == TRUE) 
    { 
     .... 
    } 
    else 
    { 
     func1(); //call to func1 sets STVAR = TRUE; 
    } 
} 

Proj2創建exe。它有​​文件。​​文件的定義如下:

cprogfunc1() 
{ 
    func2(); //call to func2 sets STVAR = TRUE; 
} 

cprogfunc2() 
{ 
    stvar = FALSE; 
    func2(); 
} 

我們在cprogfunc2()設置stvar爲false,以使其在ABC的func2()執行else塊。 h file。但是我們在cprogfunc2()下設置的值​​未反映在abc.h文件中。我們正在更新其聲明之外的靜態變量,因爲我們無法修改proj1下的任何內容。所以請建議一些方法來更新來自​​文件的靜態變量,而不要修改abc.h/Proj1。如果這是不可能的,建議任何解決方法。謝謝。

解決方案已經嘗試過:

  1. 製作stvar非靜態的 - 不可能的,因爲我們不能修改abc.h文件
  2. 使用指針 - 沒有工作
+0

你的問題很清楚,請不要使用代碼格式化的東西,arne't代碼,並清楚地指出哪個代碼在哪個文件中,以及如何編譯 –

+0

如果您問兩個不同的.exe程序是否可以共享一個靜態變量......不是這樣,他們不能 –

回答

0

根據定義,stvar作出靜態爲了限制對它的可訪問性,意味着從外部修改它的理想方式是爲它創建一個API(或實際上使其成爲全局的,而不是靜態的)。由於編輯Proj1是不可能的,所以我們的情況很糟糕。

你可以做的是通過釋放的DLL並重新加載它,重置Proj1的狀態提here.

+0

感謝您的回覆。我試圖得到DLL的句柄,將它傳遞給FreeLibrary,加載庫,然後更新靜態變量。但改變仍然沒有保留。我是否以正確的方式去做? @Ekadanta – Rash

+0

您將無法實際更新靜態變量。如果靜態文件位於.h文件中,這意味着您自己的對象文件正在獲取它的副本,並且不會影響庫的靜態變量狀態。提供的解決方案是釋放庫並重新加載它,假設這會將有問題的bool重置爲期望的狀態(False)。如果你確定這是你所做的並且它不工作 - stvar的默認狀態實際上是否可能是True並且代碼中的某個函數將它設置爲false?請分享你的嘗試。 – Ekadanta

+0

事實證明,上述不是一個可靠的解決方案 - 因爲釋放共享對象並不能保證操作系統將其從內存中釋放。重新打開時,可能不會重新初始化。見[這裏](https://stackoverflow.com/questions/24467404/dlclose-doesnt-really-unload-shared-object-no-matter-how-many-times-it-is-call) – Ekadanta