我正在通过C ++学习COM。从MSDN:
除内存分配功能外,应用程序必须先使用CoInitializeEx才能进行其他任何COM库调用。
该内存分配函数是CoTaskMemAlloc
和CoTaskMemFree
在我看来。
但是我知道,无论是否调用CoInitializeEx
andCoUninitialize
函数,我的“ Hello World”都可以正常工作。在我的代码中,我使用StringFromCLSID
了combaseapi.h
标头中声明的函数。因此,我认为这是一个COM函数。我的代码:
/* entry_point.cpp */
#include "Tools.h"
#include <objbase.h>
int main(){
HRESULT hr = ::CoInitializeEx(nullptr, COINIT_MULTITHREADED);
if (FAILED(hr)){
trace("Can't initialize COM for using in the current thread.");
keep_window_opened();
return 1;
}
// {D434CF7D-2CDD-457A-A4EF-5822D629CE83}
static const CLSID clsid =
{ 0xd434cf7d, 0x2cdd, 0x457a, {
0xa4, 0xef, 0x58, 0x22, 0xd6, 0x29, 0xce, 0x83 } };
const size_t SIZE = 39;
wchar_t* wch = nullptr;
hr = ::StringFromCLSID(clsid, &wch);
if (FAILED(hr)){
trace("Can't convert CLSID to wchar_t array.");
}
else{
trace("CLSID converted to wchar_t array.");
char mch[SIZE];
size_t count = 0;
int result = ::wcstombs_s(&count, mch, wch, SIZE);
if (result){
trace("Can't convert wchar_t array to char array.");
}
else{
trace(mch);
}
::CoTaskMemFree(wch);
}
::CoUninitialize();
keep_window_opened();
return 0;
}
如果我删除CoInitializeEx
和CoUninitialize
函数的调用,那么我的代码仍然可以工作。我希望它不会起作用...
为什么StringFromCLSID
即使没有CoInitializeEx
以前的呼吁也能工作?
谢谢。
为什么即使之前没有调用CoInitializeEx,StringFromCLSID仍能工作?
关键信息在文档中说明。
在调用任何库函数之前,需要在线程上初始化COM库,除了...内存分配函数。否则,COM函数将返回CO_E_NOTINITIALIZED。
StringFromCLSID调用StringFromGUID2函数将全局唯一标识符(GUID)转换为可打印字符的字符串。
调用方负责通过调用CoTaskMemFree函数释放为该字符串分配的内存。
StringFromCLSID()
返回动态分配的字符串。我们可以从上面突出显示的句子中推断出,使用CoTaskMemAlloc()
-分配了内存,该内存已明确记录为不需要CoInitializeEx()
。
StringFromGUID2()
将GUID
数据格式化为调用方指定的存储块。格式化字符串不需要COM功能。的wsprintfW()
,StringCbPrintfW()
或其他同等功能就足够了。因此,即使没有明确记录,也不CoInitializeEx()
需要StringFromGUID2()
。我认为,如果Microsoft不使用其许多可用的字符串格式化功能之一来实施,那将是很短视的StringFromGUID2()
。因此,我认为可以肯定地说这CoInitializeEx()
不是必需的(除非Microsoft另有说明)。
该GUID
结构仅包含一些数字和字节。声明和使用aGUID
不依赖于COM库。你可以自由地使用GUID
在所有的在你的代码你想不动人COM -除非你想生成一个新的GUID
,在这种情况下,CoInitializeEx()
对需求CoCreateGUID()
是模糊的CoCreateGUID()
是COM库,但被明确记录为简单的调用UuidCreate()
,这是在而是使用RPC库。
这就是为什么您可以StringFromCLSID()
不CoInitializeEx()
先打电话就打电话的原因。AGUID
本身不需要COM初始化。正在为该字符串分配不需要COM初始化的存储功能。而且,该字符串的格式很可能不需要COM初始化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句