比方說,我有一個是在一個多線程COM應用程序的一個線程運行下面的代碼:如何在COM多個線程中使用LoadLibrary?
// Thread 1
struct foo {
int (*DoSomething)(void ** parm);
};
HMODULE fooHandle = LoadLibrary("pathToFoo");
typedef int (*loadUpFooFP)(foo ** fooPtrPtr);
loadUpFooFP loadUpFoo;
loadUpFoo = (loadUpFooFP)GetProcAddress(fooHandle, "fooLoader");
foo * myFoo;
loadUpFoo(&myFoo);
這一切的偉大工程,然後我就可以調用
myFoo->DoSomething(&parmPtr);
這工作,也!現在,另一個線程來裝載它的foo:
// Thread 2
foo * myFooInThread2;
loadUpFoo(&myFooInThread2);
而且,這也很好。在線程2我可以調用的DoSomething:
// Thread 2
myFooInThread2->DoSomething(&anotherParmPtr);
現在,當線程1最終消失,我有一個問題。我注意到在Visual Studio中調試DoSomething的地址不能再被評估。第一個線程死後,當我打電話時:
myFooInThread2->DoSomething(&anotherParmPtr);
我得到一個訪問衝突。 myFooInThread2指針仍然有效,但函數指針不是。這個函數指針是通過調用loadUpFoo來設置的,而loadUpFoo又是由LoadLibrary加載的一個dll。
我的問題是:我從哪裏開始尋找失敗的原因?外部DLL(我用LoadLibrary加載)在我的foo結構中設置函數指針的方式有問題嗎?或者是使用相同的庫來處理不同的線程?或者,它可能以某種方式與我在此應用程序中使用COM有關(可能會在第一個線程中調用CoUninitialize以某種方式釋放此內存或庫)?
我可以提供有關COM設置的更多詳細信息,如果它看起來可能是負責任的。謝謝!
編輯:感謝您的建議。 foo結構是不透明的 - 我不太瞭解它的實現。 foo結構在我導入的頭文件中聲明。沒有我明確調用的引用計數方法,並且與LoadLibrary加載的庫沒有其他交互。我很確定foo結構不是映射到某個COM類的內存,但就像我說的那樣是不透明的,我不能肯定地說。
foo指針的生命期被正確管理(未刪除)。
foo結構是一個加密庫,所以我不能隨意泄露。在這一點上,我相信我在不同的線程和COM應用程序中使用LoadLibrary並沒有什麼本質上的錯誤(我認爲函數指針內存清除是由我自己控制之外的庫本身引起的)。
您顯示的代碼不使用COM。這只是普通的DLL使用。 – 2009-09-04 21:47:55