#pragma once // Fikocad COM Otomasyon Sunucusu — CATIA VBA makrosundan // CreateObject("Fikocad.Application") ile cagirilabilir tek metotlu (CatiaKaydet) // out-of-process (EXE, LocalServer32) COM sunucusu. // // NEDEN COM (onceki IPC/komut-satiri tasarimi yerine, bkz. docs/catia_calisma_alani.md // "com object oluştur" karari, 18 Eylul): CATIA V5'e DISARIDAN baglanma denemeleri // (AccessibleObjectFromWindow VE ROT class-moniker) GERCEK CATIA'da basarisiz oldu // (hr=0x80004005 / MK_E_UNAVAILABLE — bkz. dosyanin tarih gecmisi). Kullanicinin // karari: kesif yonunu TERSINE cevir — CATIA'nin KENDISI (VBA makro, CreateObject // ile) fikocad'a "benim PID'im, acik belgelerim su" diye BILDIRSIN (push). fikocad // artik CATIA'ya baglanmaya CALISMIYOR; yalniz PID'den HWND bulup (EnumWindows + // GetWindowThreadProcessId — COM'suz, guvenilir, catia_kesif.cpp'de zaten var ve // calisiyor) pencere geometrisi/sanal masaustu bilgisini KENDI tarafinda tamamliyor. // // VBA ornek kullanim (CATIA makro editörü, kullanicinin kendi sorumlulugunda): // Private Declare PtrSafe Function GetCurrentProcessId Lib "kernel32" () As Long // Sub CalismaAlaniniKaydet() // Dim app As Object, yollar As String, i As Integer, aktifIdx As Integer // Set app = CreateObject("Fikocad.Application") // aktifIdx = -1 // For i = 1 To CATIA.Documents.Count // If i > 1 Then yollar = yollar & "|" // yollar = yollar & CATIA.Documents.Item(i).FullName // If CATIA.Documents.Item(i).FullName = CATIA.ActiveDocument.FullName Then aktifIdx = i - 1 // Next i // Dim sonuc As String // sonuc = app.CatiaKaydet(GetCurrentProcessId(), aktifIdx, yollar) // If sonuc <> "" Then MsgBox "Kaydetme hatasi: " & sonuc Else MsgBox "Kaydedildi." // End Sub // (bos donus = basarili; dolu donus = insan-okunur hata metni — DURUST rapor, // CatiaKaydet asla sessizce basarisiz olmaz.) // // DURUST DURUM (bu dosya yazildigi oturumda): kod YAZILDI, bu ortamda (Linux/MCP, // MSVC yok) DERLENEMEDI/RUNTIME TEST EDILEMEDI — kullanicinin derle.bat ile // derleyip gercek CATIA'da denemesi GEREKIYOR, "calisiyor" burada IDDIA EDILMEZ. #include namespace fiko { // exe yaninda calisan NORMAL GUI acilisinda BIR KEZ cagirilir (idempotent, // ucuz — birkac RegSetValueEx). Yalniz HKEY_CURRENT_USER'a yazar (yonetici // hakki GEREKMEZ, UAC istemi CIKMAZ). Basarisiz olursa gunluk'e uyari yazar, // GUI acilisini ENGELLEMEZ (COM kaydi olmadan da fikocad normal calisir). void comSunucusuKaydet(); // Komut satirinda COM aktivasyon anahtari (standart "-Embedding", eski // "/Embedding" varyanti da kabul edilir) var mi? main.cpp bunu EN BASTA // kontrol eder — varsa comSunucusuCalistir()'e gecer, AGIR motor/GUI // kurulumunu (Vulkan/OCCT/lisans/CEF) HIC yapmaz. bool comEmbeddingKomutuMu(const std::wstring& komutSatiri); // COM local-server mesaj dongusu: sinif nesnesini kaydeder // (CoRegisterClassObject), gelen CatiaKaydet cagrilarini islerken TUM // istemciler ayrilip kilit sayaci sifirlanana kadar calisir, sonra DURUSTCE // cikar (0 dondurur). GUI ACMAZ — bu tamamen arka-plan/headless bir surec, // gorev cubugunda GORUNMEZ (WINDOWSUBSYSTEM zaten GUI ama pencere acilmiyor). int comSunucusuCalistir(); } // namespace fiko