InprocServer32
注册 32 位进程内服务器并指定服务器可以运行的单元的线程模型。
注册表项
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID
{CLSID}
InprocServer32
(Default) = path
ThreadingModel = value
注解
ThreadingModel 是指定线程模型的 REG_SZ 值。 下表中显示了可能的值。
值 | 说明 |
---|---|
单元 | 单线程单元 |
推送、请求和匿名 | 单线程或多线程单元 |
免费 | 多线程单元 |
中立 | 非特定单元 |
必须为进程内服务器提供的每个对象使用相同的值。
如果 ThreadingModel 不存在或未设置为某个值,服务器将加载到进程中初始化的第一个单元中。 此单元有时称为主单线程单元 (STA)。 如果进程中的第一个 STA 由 COM 初始化,而不是通过显式调用 CoInitialize 或 CoInitializeEx,则称为主机 STA。 例如,如果要加载的进程内服务器需要 STA,则 COM 会创建主机 STA,但目前进程中没有 STA。
尽可能将进程内服务器加载到与加载其的客户端相同的单元中。 如果客户端单元的线程模型与指定的模型不兼容,则会按下表所示加载服务器。
服务器的线程模型 | 单元服务器在以下位置运行 |
---|---|
<\not specified> | 主 STA: |
推送、请求和匿名 | 与客户端相同的单元 |
免费 | 多线程单元 |
中立 | 非特定单元 |
如果服务器的线程模型为“单元”,则服务器加载到的单元取决于客户端正在运行的单元,如下表所示。
单元客户端在以下位置运行 | 单元服务器在以下位置运行 |
---|---|
多线程 | 托管 STA |
中性(在 STA 线程上) | 与客户端相同的单元 |
中性(在 MTA 线程上) | 托管 STA |
COM 还可以创建主机多线程单元 (MTA)。 如果单线程单元中的客户端在进程内没有 MTA 时请求自由线程模型的进程内服务器,COM 将创建主机 MTA 并将服务器加载到其中。
对于 32 位进程内服务器,必须注册 InprocHandler32、InprocServer、InprocServer32 和 Insertable 项。 需要 InprocServer 条目才能实现向后兼容。 如果缺少此条目,该类仍有效,但无法在 16 位应用程序中加载。
如果容器在注册表中搜索进程内服务器,则 16 位版本具有 16 位容器的优先级,32 位版本具有 32 位容器的优先级。
相关主题