为什么即使之前没有调用CoInitializeEx也可以调用StringFromCLSID?

安德烈·布什曼

我正在通过C ++学习COM。MSDN

除内存分配功能外,应用程序必须先使用CoInitializeEx才能进行其他任何COM库调用

该内存分配函数CoTaskMemAllocCoTaskMemFree在我看来。

但是我知道,无论是否调用CoInitializeExandCoUninitialize函数,我的“ Hello World”都可以正常工作在我的代码中,我使用StringFromCLSIDcombaseapi.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;
}

如果我删除CoInitializeExCoUninitialize函数的调用,那么我的代码仍然可以工作。我希望它不会起作用...

为什么StringFromCLSID即使没有CoInitializeEx以前的呼吁也能工作?

谢谢。

雷米·勒博

为什么即使之前没有调用CoInitializeEx,StringFromCLSID仍能工作?

关键信息在文档中说明。

CoInitializeEx功能

在调用任何库函数之前,需要在线程上初始化COM库,除了...内存分配函数否则,COM函数将返回CO_E_NOTINITIALIZED。

StringFromCLSID功能

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么函数即使没有被调用也会运行?

为什么可以调用超类没有的方法

为什么即使调用了异常,我也没有收到任何错误消息?

为什么即使没有人调用它,paintComponent()也会运行?

为什么即使没有任何对象或字符串调用 toString() 也能工作

Python-为什么即使没有返回值,递归调用也会递增变量?

为什么 webViewDidStartLoad 没有调用?

为什么我的函数没有被调用?

为什么viewDidAppear没有调用?

为什么方法没有被调用

为什么没有调用 locationManager (:didUpdateLocations)

为什么我的方法没有调用?

为什么子进程在父进程调用wait()函数之前没有退出?

为什么可以在声明成员函数之前对其进行调用?

为什么我可以在定义之前调用函数?

为什么setTimeout调用的函数没有调用栈限制?

为什么我可以对没有stream()方法的类的对象调用stream()方法?

为什么没有任何SDK可以调用Cloud SQL API?

为什么即使没有内存重新分配,在for循环中调用push_back也不安全?

为什么即使没有重新分配输入变量,在我的递归调用期间它也会改变?

为什么调用malloc()没有什么区别?

为什么Jquery $ .ajax即使成功调用也会在函数调用时触发所有statusCode

函数即使没有被调用也能运行

为什么我的函数操作没有被调用?

为什么在活动中没有调用 addOnDestinationChangedListener

为什么我的javascript方法没有被调用?

为什么我的回调没有在 Tensorflow 中调用?

为什么没有按要求调用TypeScript toString方法

不明白为什么我的函数没有被调用