當我們創建directshow過濾器並註冊它時,靜態變量/函數會在同一過濾器的多個實例中共享。我相信這也適用於其他ActiveX控件。例如,如果我嘗試使用類似的東西;DirectShow過濾器中的靜態用法
static int counter = 0;
void someFunction() {
counter++;
// trace result here
}
如果我開始相同的過濾器的另一個實例,二審不從0開始,但在那裏留下第一個實例計數器。然後他們開始異步增加同一個計數器。
我的問題是,有沒有什麼聰明的方法來阻止DirectShow過濾器的靜態變量之間的共享?這聽起來可能很愚蠢,但如果我們註冊具有不同GUID的相同過濾器(通過使用不同的GUID和文件輸出重新編譯同一項目),靜態變量不再共享,因爲它們是兩個不同的過濾器,對吧?那麼,有什麼辦法可以使用相同的過濾器來模擬這一點,但保持靜態?
我想要做的是使用一個庫中有許多靜態用法。擺脫所有的靜態變量/函數是非常困難的。我試圖使用的庫使用Ansi C等舊標準,並沒有真正的面向對象的設計。所以封裝不是很容易。大部分功能都在全球空間,而不是在課堂上。請記住這一點。如果我保留靜態圖像,過濾器的單個實例工作正常,但由於共享(靜態)變量,其他實例開始變得混亂。
你必須採用_hard_方式 - 在圖書館週圍創建一個包裝並以面向類的方式使用它。過濾器是共享相同進程空間的對象,只有移動靜態可以幫助你在這裏,無論是類成員還是其他地方,比如TLS。 –