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";
CoInitialize(NULL);
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";
CoInitialize(NULL);
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».