Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中线程中使用的Win32 COM对象_C#_Multithreading_Delphi_Winapi_Com - Fatal编程技术网

C# C中线程中使用的Win32 COM对象

C# C中线程中使用的Win32 COM对象,c#,multithreading,delphi,winapi,com,C#,Multithreading,Delphi,Winapi,Com,我们有一个用Delphi XE开发的Win32 COM对象。通过在Delphi中开发的测试程序,我们可以在线程中启动COM对象。调试时,我们可以看到正在运行的COM对象位于调用例程创建的线程内 在我们的C应用程序中,这是一个使用与Delphi测试应用程序相同的线程执行方法开发的服务,我们没有看到相同的行为。COM对象不在执行它的C线程内运行。我们使用了Kernel32.dll的GetCurrentThreadID来获取Windows句柄。从COM对象查看Windows线程句柄时,它始终是同一个句

我们有一个用Delphi XE开发的Win32 COM对象。通过在Delphi中开发的测试程序,我们可以在线程中启动COM对象。调试时,我们可以看到正在运行的COM对象位于调用例程创建的线程内

在我们的C应用程序中,这是一个使用与Delphi测试应用程序相同的线程执行方法开发的服务,我们没有看到相同的行为。COM对象不在执行它的C线程内运行。我们使用了Kernel32.dll的GetCurrentThreadID来获取Windows句柄。从COM对象查看Windows线程句柄时,它始终是同一个句柄。它不是执行线程的句柄

是否可以在C线程内运行COM对象并使其在线程内活动?基本上,我们如何从COM对象中的C线程获得相同的Windows线程处理程序

我们的C线程是MTA


/Brian

COM DLL的线程模型是什么?您的C线程是MTA,但COM类支持的线程模型是什么?完全有可能它不受MTA支持,因此RPC管理器将启动一个单独的线程来服务并永远拥有它,将MTA的呼叫封送到该STA并返回.Hi。我们的delphicom对象是ciMultiInstance和tmpartment。这将解释单独的STA持有您的对象,这与我上面指定的原因非常接近。因此,要回答您的问题,不,您不会在MTA中创建该对象。它不支持它。如果可以创建一个STA线程,您可以从C中获取它。我是C白痴,所以我真的不知道这是否可行。TMPartment是STA Conit_APARTMENTTHREADED,tmFree或TMThread都是MTA Conit_多线程:参见