KOMPAS-3D APIの操作→レッスン3→KOMPASへの正しい接続

KOMPAS APIに関する以前のレッスン(C ++ Builderが環境として使用されることを思い出させます) 図面の 基礎設計では 、KOMPASは実行されていないと想定し、 CreateInstanceメソッドを使用して独自に開始しました。 しかし、このメソッドを呼び出したときにCOMPASSがすでに実行されている場合はどうでしょうか? 次に、このプログラムの別のインスタンスが作成されます。 原則として、何も問題はありませんが、面倒です。 1つのコピーで十分なのに、なぜプログラムのコピーを作成するのですか?







本日は、下の図に示すような画像を作成しないように、すでに起動されているKOMPASに接続する方法について説明します。





KOMPAS-3Dのいくつかのインスタンスが起動しました



コンパスへの接続



KOMPASプログラムに接続するには、 ActiveInstanceメソッドが使用されます。 以下は、KOMPASに接続するプログラムの例です。



KompasObjectPtr kompas;
kompas.ActiveInstance(L"KOMPAS.Application.5");

//  
kompas->Visible = true;
kompas.Unbind();

      
      





ActiveInstance – , , Unicode.



, ? . .















. ActiveInstance try/catch, , .



try{

KompasObjectPtr kompas;
kompas.ActiveInstance(L"KOMPAS.Application.5");
//  
kompas->Visible = true;
kompas.Unbind();

}catch(...){}

      
      





. , ActiveInstance , . : , ? .





FindWindow . FindWindow . , . .

, , , , , . . .



Spy++. ( ).





« »



, , . .



, - , «-3D» . FindWindow . , , , - «-3D». , .



//     
bool CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
//   
unsigned int size;
size = GetWindowTextLength(hwnd);
if(!size) return true;
//    
wchar_t* pbuffer;
pbuffer = (wchar_t*)malloc(sizeof(wchar_t)*(size+1));
//  
GetWindowTextW(hwnd, pbuffer, size-1);
// 
wchar_t *p;
p = wcsstr(pbuffer, L"-3D");
// 
free(pbuffer);
if(!p) return true;
// ,     
bool *pres;
pres = (bool*)lParam;
*pres = true;
return false;
}
//    ?
bool IsKOMPASRun()
{
bool res = false;
EnumWindows((WNDENUMPROC)EnumWindowsProc, (LPARAM)(&res));
return res;
}

      
      





EnumWindows, Windows API. EnumWindowsProc. , «-3D». , , – . .



if(IsKOMPASRun())
ShowMessage(" ");
else
ShowMessage("  ");

      
      





, . , , «-3D». 4. , .











. «kompas.exe» ( ). ? , .



bool IsKOMPASRun()
{
//  ,   
char ExeName[] = "kompas.exe";
size_t lenName = strlen(ExeName);
//  
HANDLE hSnapshot;
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
// 
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
Process32First(hSnapshot, &entry);
size_t len;
bool res = false;
do{
//   
len = strlen(entry.szExeFile);
if(len != lenName) continue;
if(!strnicmp(entry.szExeFile, ExeName, len))
{
res = true;
break;
}
}while(Process32Next(hSnapshot, &entry));
CloseHandle(hSnapshot);
return res;
}

      
      





CreateToolhelp32Snapshot, Process32First, Process32Next, Windows API. tlhelp32.h. , . strnicmp, .



, , . , . ? -? .



COM



. . . ole32.dll, Windows COM. , , .



bool IsKOMPASRun()
{
wchar_t ObjectName[] = L"KOMPAS.Application.5";
//  Ole32.dll
CoInitialize(NULL);
CLSID clsid;
// clsid 
CLSIDFromProgID(ObjectName, &clsid);
// 
HRESULT res;
IUnknown *pIUnknown;
res = GetActiveObject(clsid, NULL, &pIUnknown);
if(res == S_OK)
{
pIUnknown->Release();
return true;
}
return false;
}

      
      





GetActiveObject. . , , . CLSIDFromProgID CLSID ( 128- ). , . , .



bool IsKOMPASInstalled()
{
wchar_t ObjectName[] = L"KOMPAS.Application.5";
//  Ole32.dll
CoInitialize(NULL);
CLSID clsid;
// clsid 
HRESULT res;
res = CLSIDFromProgID(ObjectName, &clsid);
return (res == S_OK);
}

      
      







, .



wchar_t ObjectName[] = L"KOMPAS.Application.5";

……………………………………………………………

if(! IsKOMPASInstalled())
{
   ShowMessage("  ");
   return;
}

KompasObjectPtr kompas;

if(IsKOMPASRun())
   kompas.ActiveInstance(ObjectName);
else
   kompas.CreateInstance(ObjectName);

kompas->Visible = true;
kompas.Unbind();

      
      





ObjectName , .





, . . , . , GetActiveObject.



, .



.



, « Delphi».



All Articles