我们在制作一个com组件的时候,要么是dll的,要么是exe的。当我CoCreateInstance的时候,注册表里面的信息就已经包含了该com服务器是一个dll文件还是一个exe文件,路径都有了。那么为什么CoCreateInstance的第三个参数仍然可以去指定是进程内的(dll)还是进程外的(exe)?msdn的解释是:dwClsContext
[in] Context in which the code that manages the newly created object will run. The values are taken from the enumeration CLSCTX. typedef enum tagCLSCTX {
CLSCTX_INPROC_SERVER = 0x1,
CLSCTX_INPROC_HANDLER = 0x2,
CLSCTX_LOCAL_SERVER = 0x4,
CLSCTX_INPROC_SERVER16 = 0x8,
CLSCTX_REMOTE_SERVER = 0x10,
CLSCTX_INPROC_HANDLER16 = 0x20,
CLSCTX_RESERVED1 = 0x40,
CLSCTX_RESERVED2 = 0x80,
CLSCTX_RESERVED3 = 0x100,
CLSCTX_RESERVED4 = 0x200,
CLSCTX_NO_CODE_DOWNLOAD = 0x400,
CLSCTX_RESERVED5 = 0x800,
CLSCTX_NO_CUSTOM_MARSHAL = 0x1000,
CLSCTX_ENABLE_CODE_DOWNLOAD = 0x2000,
CLSCTX_NO_FAILURE_LOG = 0x4000,
CLSCTX_DISABLE_AAA = 0x8000,
CLSCTX_ENABLE_AAA = 0x10000,
CLSCTX_FROM_DEFAULT_CONTEXT = 0x20000,
CLSCTX_ACTIVATE_32_BIT_SERVER = 0x40000,
CLSCTX_ACTIVATE_64_BIT_SERVER = 0x80000
} CLSCTX; 问题是加载这个com组件文件的时候系统就已经能知道它是dll还是exe了啊。那这个参数到底什么时候有用呢?
[in] Context in which the code that manages the newly created object will run. The values are taken from the enumeration CLSCTX. typedef enum tagCLSCTX {
CLSCTX_INPROC_SERVER = 0x1,
CLSCTX_INPROC_HANDLER = 0x2,
CLSCTX_LOCAL_SERVER = 0x4,
CLSCTX_INPROC_SERVER16 = 0x8,
CLSCTX_REMOTE_SERVER = 0x10,
CLSCTX_INPROC_HANDLER16 = 0x20,
CLSCTX_RESERVED1 = 0x40,
CLSCTX_RESERVED2 = 0x80,
CLSCTX_RESERVED3 = 0x100,
CLSCTX_RESERVED4 = 0x200,
CLSCTX_NO_CODE_DOWNLOAD = 0x400,
CLSCTX_RESERVED5 = 0x800,
CLSCTX_NO_CUSTOM_MARSHAL = 0x1000,
CLSCTX_ENABLE_CODE_DOWNLOAD = 0x2000,
CLSCTX_NO_FAILURE_LOG = 0x4000,
CLSCTX_DISABLE_AAA = 0x8000,
CLSCTX_ENABLE_AAA = 0x10000,
CLSCTX_FROM_DEFAULT_CONTEXT = 0x20000,
CLSCTX_ACTIVATE_32_BIT_SERVER = 0x40000,
CLSCTX_ACTIVATE_64_BIT_SERVER = 0x80000
} CLSCTX; 问题是加载这个com组件文件的时候系统就已经能知道它是dll还是exe了啊。那这个参数到底什么时候有用呢?
我初学,目前是这样理解的。错在哪里呢? dll是要被进程加载的就是进程内? exe因为是另一个进程,所以算是进程外?还请大侠斧正!非常困惑的一个问题。
我初学,目前是这样理解的。错在哪里呢? dll是要被进程加载的就是进程内? exe因为是另一个进程,所以算是进程外?还请大侠斧正!非常困惑的一个问题。
还有DCOM方式,可以去看看