delphi 在多线程中使用 CreateOleObject 导致失败(一定要使用CoInitialize和CoUninitialize,举例查询WMI)

原帖地址

http://bbs.csdn.net/topics/390481350

解决办法

[delphi] view plain copy
 
  1. procedure DisplayVideoInfo;  
  2. var  
  3.   wmi, objs, obj : OleVariant;  
  4.   enum           : IEnumVariant;  
  5.   value          : Cardinal;  
  6. begin  
  7.   try  
  8.     CoInitialize(nil);//  加上这两句  
  9.     wmi := CreateOleObject('WbemScripting.SWbemLocator');  
  10.     // ConnectServer无参表示连接本机  
  11.     objs := wmi.ConnectServer()  
  12.       .ExecQuery('SELECT * FROM Win32_VideoController');  
  13.     enum := IUnknown(objs._NewEnum) as IEnumVariant;  
  14.     enum.Reset;  
  15.     // 扫描每一块显卡  
  16.     while enum.Next(1, obj, value) = S_OK do  
  17.     begin  
  18.       szString.Add('名称    :' + obj.Name);  
  19.       szString.Add('制造商   :' + obj.AdapterCompatibility);  
  20.       szString.Add('芯片类型  :' + obj.VideoProcessor);  
  21.       szString.Add('DAC类型   :' + obj.AdapterDACType);  
  22.       szString.Add('显存    :' +  
  23.         VarToStr(Round(obj.AdapterRAM / 1024 / 1024)) + 'MB');  
  24.       szString.Add('颜色    :' + VarToStr(obj.CurrentBitsPerPixel) + '位');  
  25.       szString.Add(Format('屏幕分辨率是:%d * %d', [Screen.Width, Screen.Height]));  
  26.     end;  
  27.   finally  
  28.     CoUninitialize();//加上这两句  
  29.   end;  
  30. end;  

 http://blog.csdn.net/warrially/article/details/11974729

原文地址:https://www.cnblogs.com/findumars/p/6359747.html