597 lines
14 KiB
C++
597 lines
14 KiB
C++
|
|
#include "stdafx.h"
|
|
|
|
#include <actrans.h>
|
|
#include "settoolbardlg.h"
|
|
#include "tapi.h"
|
|
#include "twtdef.h"
|
|
|
|
|
|
#if (ADS==19)
|
|
#ifdef _WIN64
|
|
#include "acadi_i.c"
|
|
#import "acax19enu.tlb"
|
|
#else
|
|
#include "acadi_i.c"
|
|
#import "acax19enu.tlb"
|
|
#endif
|
|
|
|
#elif (ADS==18)
|
|
#ifdef _WIN64
|
|
#include "acadi_i.c"
|
|
#import "acax18enu.tlb"
|
|
#else
|
|
#include "acadi_i.c"
|
|
#import "acax18enu.tlb"
|
|
#endif
|
|
|
|
#elif (ADS==20)
|
|
#ifdef _WIN64
|
|
#include "acadi_i.c"
|
|
#import "acax20enu.tlb"
|
|
#else
|
|
#include "acadi_i.c"
|
|
#import "acax20enu.tlb"
|
|
#endif
|
|
|
|
#elif (ADS==21)
|
|
#ifdef _WIN64
|
|
#include "acadi_i.c"
|
|
#import "acax21enu.tlb"
|
|
#else
|
|
#include "acadi_i.c"
|
|
#import "acax21enu.tlb"
|
|
#endif
|
|
|
|
#elif (ADS==22)
|
|
#ifdef _WIN64
|
|
#include "acadi_i.c"
|
|
#import "acax22enu.tlb"
|
|
#else
|
|
#include "acadi_i.c"
|
|
#import "acax22enu.tlb"
|
|
#endif
|
|
|
|
#elif (ADS==17)
|
|
#include "acadi_i.c"
|
|
#import "acax17enu.tlb"
|
|
#elif (ADS==16)
|
|
#include "acadi_i.c"
|
|
#import "c:\\Program Files\\Common Files\\Autodesk Shared\\acax16enu.tlb"
|
|
#elif(ADS==15)
|
|
#include "acad15_i.c"
|
|
#import "e:\\AutoCAD 2002\\Acad.tlb"
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
using namespace AutoCAD;
|
|
|
|
//卸载ARX的时候,要把上华工具条隐藏
|
|
void UnloadToolbar()
|
|
{
|
|
CString csReg;
|
|
#if(ADS > 18)
|
|
csReg = acdbHostApplicationServices()->getUserRegistryProductRootKey();
|
|
#else
|
|
csReg = acrxDynamicLinker->ProductKey();
|
|
#endif
|
|
|
|
CString csRegUnname = csReg;
|
|
if(g_nProductId==16)
|
|
csReg.Format(_T("%s\\Profiles\\TElec9"), csReg);
|
|
else if(g_nProductId==14)
|
|
csReg.Format(_T("%s\\Profiles\\TWT9"), csReg);
|
|
CRegProperty regProp(csReg, _T("toolbars"));
|
|
regProp.SetTopRootKey(HKEY_CURRENT_USER);
|
|
regProp.SetValue(_T("ACAD.TCH"), _T("hide bottom 0 0"));
|
|
//////////////////////////////////////////////////////////////
|
|
// cet 2014.5.30 modify cad2008调试状态关闭cad时,出现异常
|
|
// csRegUnname.Format(_T("%s\\Profiles\\<<Unnamed Profile>>"), csRegUnname);
|
|
CString sTemp = csRegUnname;
|
|
csRegUnname.Format(_T("%s\\Profiles\\<<Unnamed Profile>>"), sTemp);
|
|
CRegProperty regProp2(csRegUnname, _T("toolbars"));
|
|
regProp2.SetTopRootKey(HKEY_CURRENT_USER);
|
|
regProp2.SetValue(_T("ACAD.TCH"), _T("hide bottom 0 0"));
|
|
}
|
|
|
|
void CleanUpToolbars(IAcadToolbarsPtr &pToolbars)
|
|
{
|
|
CString csToolbarsName;
|
|
csToolbarsName = _T("TCH");
|
|
long cnt = 0;
|
|
pToolbars->get_Count(&cnt);
|
|
BSTR tempName;
|
|
VARIANT vtName;
|
|
for ( long i=0; i < cnt; i++)
|
|
{
|
|
IAcadToolbarPtr pToolbar = NULL;
|
|
vtName.vt = VT_I4;
|
|
vtName.lVal = i;
|
|
pToolbar = pToolbars->Item(vtName);
|
|
pToolbar->get_Name(&tempName);
|
|
CString tlbrName(tempName);
|
|
SysFreeString(tempName);
|
|
if(tlbrName.CompareNoCase((const TCHAR*)csToolbarsName)==0)
|
|
{
|
|
pToolbar->Delete();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
BOOL IsExistToolbarItem(IAcadToolbarsPtr &pToolbars, const TCHAR* szItem)
|
|
{
|
|
CString csItem = szItem;
|
|
long cnt = 0;
|
|
pToolbars->get_Count(&cnt);
|
|
BSTR tempName;
|
|
VARIANT vtName;
|
|
for ( long i=0; i < cnt; i++)
|
|
{
|
|
IAcadToolbarPtr pToolbar = NULL;
|
|
vtName.vt = VT_I4;
|
|
vtName.lVal = i;
|
|
pToolbar = pToolbars->Item(vtName);
|
|
pToolbar->get_Name(&tempName);
|
|
CString tlbrName(tempName);
|
|
SysFreeString(tempName);
|
|
if(tlbrName.CompareNoCase(csItem)==0)
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
int GetToolbarPos(IAcadToolbarsPtr &pToolbars)
|
|
{
|
|
CString csToolbarsName;
|
|
csToolbarsName = _T("TCH");
|
|
long cnt = 0;
|
|
pToolbars->get_Count(&cnt);
|
|
BSTR tempName;
|
|
VARIANT vtName;
|
|
for ( long i=0; i < cnt; i++)
|
|
{
|
|
IAcadToolbarPtr pToolbar = NULL;
|
|
vtName.vt = VT_I4;
|
|
vtName.lVal = i;
|
|
pToolbar = pToolbars->Item(vtName);
|
|
pToolbar->get_Name(&tempName);
|
|
CString tlbrName(tempName);
|
|
SysFreeString(tempName);
|
|
if(tlbrName.CompareNoCase((const TCHAR*)csToolbarsName)==0)
|
|
{
|
|
BOOL bLeft(FALSE);
|
|
AcToolbarDockStatus Status;
|
|
pToolbar->get_DockStatus(&Status);
|
|
if(Status == acToolbarDockTop)
|
|
return 0;
|
|
else if(Status == acToolbarDockBottom)
|
|
return 1;
|
|
else if(Status == acToolbarDockLeft)
|
|
return 2;
|
|
else if(Status == acToolbarDockRight)
|
|
return 3;
|
|
else
|
|
return 4;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
BOOL GetToolbarVisible()
|
|
{
|
|
CString csToolbarsName;
|
|
csToolbarsName = _T("TCH");
|
|
|
|
BOOL ret(FALSE);
|
|
CoInitialize(NULL);
|
|
|
|
IAcadApplication *pApp = NULL;
|
|
AfxGetApp()->GetIDispatch(FALSE)->QueryInterface(__uuidof(IAcadApplication), (void **)&pApp);
|
|
if (pApp == NULL)
|
|
return ret;
|
|
IAcadMenuGroupsPtr pMenuGroups = pApp->GetMenuGroups();
|
|
if(pMenuGroups == NULL){
|
|
pApp->Release();
|
|
CoUninitialize();
|
|
return ret;
|
|
}
|
|
long cnt = 0;
|
|
pMenuGroups->get_Count(&cnt);
|
|
IAcadMenuGroupPtr mnuGrp = NULL;
|
|
IAcadMenuGroupPtr pMnuGrp = NULL;
|
|
for(long i=0;i<cnt;i++){
|
|
VARIANT vtName;
|
|
vtName.vt = VT_I4;
|
|
vtName.lVal = i;
|
|
mnuGrp = pMenuGroups->Item(vtName);
|
|
if(mnuGrp == NULL){
|
|
pApp->Release();
|
|
CoUninitialize();
|
|
return ret;
|
|
}
|
|
BSTR grpName;
|
|
mnuGrp->get_Name(&grpName);
|
|
CString cgrpName(grpName);
|
|
if (cgrpName.CompareNoCase(_T("Acad"))==0) {
|
|
pMnuGrp = mnuGrp;
|
|
break;
|
|
}
|
|
|
|
}
|
|
if(pMnuGrp == NULL){
|
|
pApp->Release();
|
|
CoUninitialize();
|
|
return ret;
|
|
}
|
|
|
|
IAcadToolbarsPtr pToolbars = NULL;
|
|
pMnuGrp->get_Toolbars(&pToolbars);
|
|
|
|
pToolbars->get_Count(&cnt);
|
|
BSTR tempName;
|
|
VARIANT vtName;
|
|
for (i=0; i < cnt; i++)
|
|
{
|
|
IAcadToolbarPtr pToolbar = NULL;
|
|
vtName.vt = VT_I4;
|
|
vtName.lVal = i;
|
|
pToolbar = pToolbars->Item(vtName);
|
|
pToolbar->get_Name(&tempName);
|
|
CString tlbrName(tempName);
|
|
SysFreeString(tempName);
|
|
if(tlbrName.CompareNoCase((const TCHAR*)csToolbarsName)==0)
|
|
{
|
|
short flag;
|
|
pToolbar->get_Visible(&flag);
|
|
if(pToolbar->Visible == -1)
|
|
ret = TRUE;
|
|
else
|
|
ret = FALSE;
|
|
break;
|
|
}
|
|
}
|
|
pApp->Release();
|
|
CoUninitialize();
|
|
return ret;
|
|
}
|
|
|
|
BOOL SetToolbarVisible(BOOL bOpen)
|
|
{
|
|
CString csToolbarsName;
|
|
|
|
csToolbarsName = _T("TCH");
|
|
|
|
BOOL ret(FALSE);
|
|
CoInitialize(NULL);
|
|
|
|
IAcadApplication *pApp = NULL;
|
|
AfxGetApp()->GetIDispatch(FALSE)->QueryInterface(__uuidof(IAcadApplication), (void **)&pApp);
|
|
if (pApp == NULL)
|
|
return ret;
|
|
IAcadMenuGroupsPtr pMenuGroups = pApp->GetMenuGroups();
|
|
if(pMenuGroups == NULL){
|
|
pApp->Release();
|
|
CoUninitialize();
|
|
return ret;
|
|
}
|
|
long cnt = 0;
|
|
pMenuGroups->get_Count(&cnt);
|
|
IAcadMenuGroupPtr mnuGrp = NULL;
|
|
IAcadMenuGroupPtr pMnuGrp = NULL;
|
|
for(long i=0;i<cnt;i++){
|
|
VARIANT vtName;
|
|
vtName.vt = VT_I4;
|
|
vtName.lVal = i;
|
|
mnuGrp = pMenuGroups->Item(vtName);
|
|
if(mnuGrp == NULL){
|
|
pApp->Release();
|
|
CoUninitialize();
|
|
return ret;
|
|
}
|
|
BSTR grpName;
|
|
mnuGrp->get_Name(&grpName);
|
|
CString cgrpName(grpName);
|
|
if (cgrpName.CompareNoCase(_T("Acad"))==0) {
|
|
pMnuGrp = mnuGrp;
|
|
break;
|
|
}
|
|
|
|
}
|
|
if(pMnuGrp == NULL){
|
|
pApp->Release();
|
|
CoUninitialize();
|
|
return ret;
|
|
}
|
|
|
|
IAcadToolbarsPtr pToolbars = NULL;
|
|
pMnuGrp->get_Toolbars(&pToolbars);
|
|
|
|
pToolbars->get_Count(&cnt);
|
|
BSTR tempName;
|
|
VARIANT vtName;
|
|
for (i=0; i < cnt; i++)
|
|
{
|
|
IAcadToolbarPtr pToolbar = NULL;
|
|
vtName.vt = VT_I4;
|
|
vtName.lVal = i;
|
|
pToolbar = pToolbars->Item(vtName);
|
|
pToolbar->get_Name(&tempName);
|
|
CString tlbrName(tempName);
|
|
SysFreeString(tempName);
|
|
if(tlbrName.CompareNoCase((const TCHAR*)csToolbarsName)==0)
|
|
{
|
|
ret = TRUE;
|
|
if(bOpen)
|
|
pToolbar->Visible = -1;
|
|
else
|
|
pToolbar->put_Visible(FALSE);
|
|
break;
|
|
}
|
|
}
|
|
pApp->Release();
|
|
CoUninitialize();
|
|
return ret;
|
|
}
|
|
|
|
|
|
IAcadToolbarsPtr GetToolbars()
|
|
{
|
|
|
|
CoInitialize(NULL);
|
|
|
|
IAcadApplication *pApp = NULL;
|
|
AfxGetApp()->GetIDispatch(FALSE)->QueryInterface(__uuidof(IAcadApplication), (void **)&pApp);
|
|
if (pApp == NULL)
|
|
return NULL;
|
|
IAcadMenuGroupsPtr pMenuGroups = pApp->GetMenuGroups();
|
|
if(pMenuGroups == NULL){
|
|
pApp->Release();
|
|
CoUninitialize();
|
|
return NULL;
|
|
}
|
|
long cnt = 0;
|
|
pMenuGroups->get_Count(&cnt);
|
|
IAcadMenuGroupPtr mnuGrp = NULL;
|
|
IAcadMenuGroupPtr pMnuGrp = NULL;
|
|
for(long i=0;i<cnt;i++){
|
|
VARIANT vtName;
|
|
vtName.vt = VT_I4;
|
|
vtName.lVal = i;
|
|
mnuGrp = pMenuGroups->Item(vtName);
|
|
if(mnuGrp == NULL){
|
|
pApp->Release();
|
|
CoUninitialize();
|
|
return NULL;
|
|
}
|
|
BSTR grpName;
|
|
mnuGrp->get_Name(&grpName);
|
|
CString cgrpName(grpName);
|
|
if (cgrpName.CompareNoCase(_T("Acad"))==0) {
|
|
pMnuGrp = mnuGrp;
|
|
break;
|
|
}
|
|
|
|
}
|
|
if(pMnuGrp == NULL){
|
|
pApp->Release();
|
|
CoUninitialize();
|
|
return NULL;
|
|
}
|
|
|
|
IAcadToolbarsPtr pToolbars = NULL;
|
|
pMnuGrp->get_Toolbars(&pToolbars);
|
|
pApp->Release();
|
|
CoUninitialize();
|
|
return pToolbars;
|
|
}
|
|
|
|
void SetToolbarPos()
|
|
{
|
|
CString csConfigName;
|
|
if(g_nProductId==16)
|
|
csConfigName = _T("TElecConfig");
|
|
else if(g_nProductId==14)
|
|
csConfigName = _T("TwtConfig");
|
|
else if(g_nProductId==15)
|
|
csConfigName = _T("THvacConfig");
|
|
else if(g_nProductId==1)
|
|
csConfigName = _T("Settings");
|
|
|
|
IAcadToolbarsPtr pToolbars = GetToolbars();
|
|
if(pToolbars)
|
|
{
|
|
int pos = GetToolbarPos(pToolbars);
|
|
CRegProperty regProp(GetRegLocation(), (const TCHAR*)csConfigName);
|
|
regProp.SetTopRootKey(HKEY_CURRENT_USER);
|
|
regProp.SetValue(_T("ToolbarPos"), pos);
|
|
}
|
|
}
|
|
|
|
void CreateToolbars()
|
|
{
|
|
CString csToolbarsName;
|
|
csToolbarsName = _T("TCH");
|
|
|
|
CString csConfigName, csCmd;
|
|
if(g_nProductId==16){
|
|
csConfigName = _T("TElecConfig");
|
|
}
|
|
else if(g_nProductId==14){
|
|
csConfigName = _T("TwtConfig");
|
|
}
|
|
else if(g_nProductId==15)
|
|
csConfigName = _T("THvacConfig");
|
|
else if(g_nProductId==1){
|
|
csConfigName = _T("Settings");
|
|
}
|
|
|
|
int iToolbarPos(-1);
|
|
CRegProperty regProp(GetRegLocation(), (const TCHAR*)csConfigName);
|
|
regProp.SetTopRootKey(HKEY_CURRENT_USER);
|
|
regProp.GetValue(_T("ToolbarPos"), iToolbarPos);
|
|
if(iToolbarPos < 0)
|
|
iToolbarPos = 1;
|
|
|
|
CodeBase db;
|
|
XString xsDbfFile, xsDllFile;
|
|
DList<CToolbarData> lstToolbarData;
|
|
if(!FindFile(_T("tchdata.dbf"), xsDbfFile)) {
|
|
AfxMessageBox(_T("对不起,没有发现tchdata.dbf文件!"));
|
|
return;
|
|
}
|
|
if(!FindFile(_T("Acad.dll"), xsDllFile)) {
|
|
AfxMessageBox(_T("对不起,没有发现Acad.dll文件!"));
|
|
return;
|
|
}
|
|
lstToolbarData.Append(new CToolbarData(_T(""), _T("options"), _T("初始设置"), _T("对整个上华软件进行初始设置"), _T("TEL_16_SETTING"), 1));
|
|
lstToolbarData.Append(new CToolbarData(_T(""), _T("gjt"), _T("工 具 条"), _T("用户自定义设置上华快捷工具条: GJT"), _T("TEL_16_TOOLBAR"), 1));
|
|
lstToolbarData.Append(new CToolbarData(_T(""), _T("glxz"), _T("过滤选择"), _T("先选参考图元,选择其它符合参考图元过滤条件的图形,生成选择集"), _T("TWT_16_GLXZ"), 1));
|
|
lstToolbarData.Append(new CToolbarData(_T(""), _T("tzkb"), _T("上华拷贝"), _T("动态连续的复制对象"), _T("Tch_DragCopy"), 1));
|
|
lstToolbarData.Append(new CToolbarData(_T(""), _T("lcjb"), _T("图形导出"), _T("把上华图形文件另存为ACAD兼容的R14格式dwg, 以便与非上华环境交流, 注意字体文件shx要一致"), _T("Icon_16_Save"), 1));
|
|
lstToolbarData.Append(new CToolbarData(_T("1"), _T(""), _T(""), _T(""), _T(""), 1));
|
|
|
|
CString csName, csDescribe, csIcon, csType;
|
|
int iHit;
|
|
XDbfTable *pTable = db.Open(xsDbfFile);
|
|
if(pTable) {
|
|
pTable->MoveFirst();
|
|
while(!pTable->IsEOF()) {
|
|
GET_FIELD(pTable, _T("chacmd"), csName);
|
|
GET_FIELD(pTable, _T("engcmd"), csCmd);
|
|
GET_FIELD(pTable, _T("explain"), csDescribe);
|
|
GET_FIELD(pTable, _T("icon"), csIcon);
|
|
GET_FIELD(pTable, _T("flag"), iHit);
|
|
GET_FIELD(pTable, _T("type"), csType);
|
|
if(iHit > 0)
|
|
lstToolbarData.Append(new CToolbarData(csType, csCmd, csName, csDescribe, csIcon, iHit));
|
|
pTable->MoveNext();
|
|
}
|
|
}
|
|
else{
|
|
return;
|
|
}
|
|
lstToolbarData.QuickSort(CToolbarData::SortByItem);
|
|
// cet 2015.1.7 add 排序后分隔符位置在索引0位置引发错误导致无法生成工具栏
|
|
if(lstToolbarData[0]->m_csType == _T("1"))
|
|
{
|
|
lstToolbarData.Swap(0, 5);
|
|
}
|
|
|
|
|
|
CoInitialize(NULL);
|
|
|
|
IAcadApplication *pApp = NULL;
|
|
AfxGetApp()->GetIDispatch(FALSE)->QueryInterface(__uuidof(IAcadApplication), (void **)&pApp);
|
|
if (pApp == NULL)
|
|
{
|
|
|
|
return;
|
|
}
|
|
IAcadMenuGroupsPtr pMenuGroups = pApp->GetMenuGroups();
|
|
if(pMenuGroups == NULL){
|
|
pApp->Release();
|
|
CoUninitialize();
|
|
return;
|
|
}
|
|
long cnt = 0;
|
|
pMenuGroups->get_Count(&cnt);
|
|
IAcadMenuGroupPtr mnuGrp = NULL;
|
|
IAcadMenuGroupPtr pMnuGrp = NULL;
|
|
for(long i=0;i<cnt;i++){
|
|
VARIANT vtName;
|
|
vtName.vt = VT_I4;
|
|
vtName.lVal = i;
|
|
mnuGrp = pMenuGroups->Item(vtName);
|
|
if(mnuGrp == NULL){
|
|
pApp->Release();
|
|
CoUninitialize();
|
|
return;
|
|
}
|
|
BSTR grpName;
|
|
mnuGrp->get_Name(&grpName);
|
|
CString cgrpName(grpName);
|
|
if (cgrpName.CompareNoCase(_T("Acad"))==0) {
|
|
pMnuGrp = mnuGrp;
|
|
break;
|
|
}
|
|
|
|
}
|
|
if(pMnuGrp == NULL){
|
|
pApp->Release();
|
|
CoUninitialize();
|
|
return;
|
|
}
|
|
IAcadToolbarsPtr tlbrs = NULL;
|
|
IAcadToolbarPtr tlbr = NULL;
|
|
pMnuGrp->get_Toolbars(&tlbrs);
|
|
CleanUpToolbars(tlbrs);
|
|
_bstr_t bToolbarsName = (const TCHAR*)csToolbarsName;
|
|
tlbr = tlbrs->Add(bToolbarsName);
|
|
if(tlbr == NULL){
|
|
pApp->Release();
|
|
CoUninitialize();
|
|
return;
|
|
}
|
|
|
|
|
|
VARIANT index;
|
|
index.vt = VT_I4;
|
|
index.lVal = 100l;
|
|
|
|
VARIANT vtFalse;
|
|
vtFalse.vt = VT_BOOL;
|
|
vtFalse.boolVal = VARIANT_FALSE; //VARIANT_TRUE 有下一级
|
|
int count = lstToolbarData.Length();
|
|
for(int j=0;j<count;j++){
|
|
if(lstToolbarData[j]->m_csType == _T("1")){
|
|
continue;
|
|
}
|
|
|
|
IAcadToolbarItemPtr button = NULL;
|
|
_bstr_t bName = lstToolbarData[j]->m_csName;
|
|
_bstr_t bDescribe = lstToolbarData[j]->m_csDescribe;
|
|
CString csTmp = lstToolbarData[j]->m_csCmd;
|
|
CString csCmd = _T("\33\33");
|
|
if(csTmp.Find(_T(";")) > -1){ //lisp命令
|
|
int idx = csTmp.Find(_T(";"));
|
|
CString csLeft = csTmp.Left(idx);
|
|
CString csRight = csTmp.Right(csTmp.GetLength() - idx - 1);
|
|
csCmd = csCmd + csLeft + _T("\n") + csRight + _T("\n");
|
|
}
|
|
else if(_tcsicmp(csTmp, _T("'OpenAllLayer")) == 0) //透明命令,不需要打断之前命令
|
|
csCmd = lstToolbarData[j]->m_csCmd + _T("\n");
|
|
else
|
|
csCmd = csCmd + lstToolbarData[j]->m_csCmd + _T("\n");
|
|
_bstr_t bCmd = csCmd;
|
|
_bstr_t bIcon = lstToolbarData[j]->m_csIcon;
|
|
button = tlbr->AddToolbarButton(index, bName, bDescribe, bCmd, vtFalse);
|
|
|
|
|
|
HINSTANCE hInstance = LoadLibrary(xsDllFile);
|
|
HBITMAP hBmp = NULL;
|
|
hBmp = LoadBitmap(hInstance, lstToolbarData[j]->m_csIcon);
|
|
if(hBmp)
|
|
button->SetBitmaps(bIcon, bIcon);
|
|
if(j > 0 && lstToolbarData[j-1]->m_csType == _T("1")){
|
|
tlbr->AddSeparator(index);
|
|
}
|
|
}
|
|
|
|
if(iToolbarPos == 0)
|
|
tlbr->Dock(acToolbarDockTop);
|
|
else if(iToolbarPos == 1)
|
|
tlbr->Dock(acToolbarDockBottom);
|
|
else if(iToolbarPos == 2)
|
|
tlbr->Dock(acToolbarDockLeft);
|
|
else
|
|
tlbr->Dock(acToolbarDockRight);
|
|
pApp->Release();
|
|
CoUninitialize();
|
|
|
|
}
|
|
|