gpt4 book ai didi

c++ - 是否使用 COM ATL 线程模型

转载 作者:太空宇宙 更新时间:2023-11-04 12:20:31 24 4
gpt4 key购买 nike

我对 COM 线程模型有点困惑。

我有一个 C++ COM DLL。定义为单户型:

_ATL_APARTMENT_THREADED

我的测试应用是用 C# 编写的,并执行以下操作:

start thread 1
thread 1:setName
start thread 2
thread 2:setName

因为我的 dll 是 ATL,所以我希望 DLL 中的名称属性是任何线程设置它的名称。
但看起来 COM 正在为调用它的每个线程初始化一个新对象。

但我不想那样。

我做错了什么?

附言: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);
...

这些只是我在 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());
}

最佳答案

您永远不会在代码中实例化 COM 对象。您在调用 CoCreateInstance() WinAPI 函数的互操作程序集(当您添加对 COM 库的引用时获得的那个)的类型上使用 new 实例化一个 COM 对象在引擎盖下。不调用 CoCreateInstance() - 没有线程模型,因此对哪些线程可以调用什么没有限制。

请花时间阅读this very good explanation of COM apartments and threading .

关于c++ - 是否使用 COM ATL 线程模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5350651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com