我對COM線程模型有點困惑。COM ATL線程模型與否
我得到了一個C++ COM DLL。它被定義爲單身公寓模式:
_ATL_APARTMENT_THREADED
我的測試應用程序是用C#編寫並執行以下操作:
start thread 1
thread 1:setName
start thread 2
thread 2:setName
,因爲我的DLL是ATL我希望在DLL name屬性無論任何線程設置它。
但它看起來像COM正在爲每個正在調用它的線程初始化一個新對象。
但我不想那樣。
我做錯了什麼?
PS: C++ DLL的StdAfx.h:
#define _ATL_APARTMENT_THREADED
C++ DLL MyApp.cpp中:
myApp::InitInstance() {
CoInitialize(NULL);
}
C#TestApp的Program.cs:
[STAThread]<br>
static void Main(string[] args) {
MyThreadClass t1 = new MyThreadClass(name1, pass1);
MyThreadClass t2 = new MyThreadClass(name2, pass2);
new Thread(new ThreadStart(t1.RunMethod)).Start();
Thread.Sleep(2000);
new Thread(new ThreadStart(t2.RunMethod)).Start();
C#TestApp MyThreadClass:
public void RunMethod() {
ComDllWrapper.SetName(name);
Console.WriteLine(ComDllWrapper.GetName());
Thread.Sleep(1000);
ComDllWrapper.SetPass(pass);
Console.WriteLine(ComDllWrapper.GetPass());
Thread.Sleep(1000);
...
}
C#TestApp ComDllWrapper:
[DllImport(DLLNAME)]
public static extern void SetName(string name);
...
這些僅是2值I在設定DLL(名稱和傳遞),但也有更多。但2個線程不寫入同一個對象。每個線程都有自己的對象來寫入。
這是我如何初始化DLL:
C#TestApp ComDllWrapper
[DllImport("kernel32.dll", EntryPoint = "LoadLibrary", SetLastError = true)]
private static extern int LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpLibFileName);
public loadWrapper(string path) {
var filename = Path.Combine(path, DLLNAME);
LoadLibrary(filename);
Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error());
}
顯示一些真實的代碼。 – Henrik 2011-03-18 10:32:04
+1 @Henrik:Juergen,展示瞭如何初始化COM對象以及如何在線程之間共享它。通常你必須確保你的對象被正確編組。 – Andrey 2011-03-18 12:57:25
你似乎沒有實例化一個COM對象 - 你只需要使用DllImport。這是沒有實際的COM - 你只是在一個調用它的線程上執行一個函數。 – sharptooth 2011-03-18 13:05:27