| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
Autor
|
Thema: API get_IActiveDoc2 (560 mal gelesen)
|
doudou Mitglied Softwareentwicklung

 Beiträge: 13 Registriert: 17.09.2003
|
erstellt am: 01. Jul. 2005 19:13 <-- editieren / zitieren --> Unities abgeben:         
Hallo Kollegen, Ich habe ein ATL-AddIn generieren lassen und das AddIn erweitert. Darin habe ich einmal die Funktion SldWorks->get_IActiveDoc2 verwendet, um auf das aktive Dokument zuzugreifen. Wenn das Programm in Debug-Mode erstellt ist (VC6), läuft es prima. Wenn das Programm in Release-Mode erstellt wird, liefert die Funktion einen NULL-Pointer zurück. Ich bin sehr dankbar, wenn jemand mir weiter helfen kann Viele Grüße! Jin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
PASCAM Mitglied Diplom Informatiker

 Beiträge: 67 Registriert: 25.11.2002
|
erstellt am: 01. Jul. 2005 22:37 <-- editieren / zitieren --> Unities abgeben:          Nur für doudou
Hallo Jin, Ist auch wirklich ein Modell geoeffnet? Ein wenig Source-Code wuerde auch nicht schaden, da mit dieser Methode mir keine Probleme bekannt sind. Gruss, Ralph ------------------ PASCAM Ralph Müller Softwareentwicklung Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Atsam Mitglied Dipl.-Ing. Mechatronik (BA)
 
 Beiträge: 199 Registriert: 22.11.2004 SolidWorks Office Premium 2010 x64 Edition, SP 5.0
|
erstellt am: 04. Jul. 2005 06:50 <-- editieren / zitieren --> Unities abgeben:          Nur für doudou
Hallo doudou. Ich weiß nicht so ganz, ob dies der richtige Befehl ist den du brauchst. Mit dem Befehl IActiveDoc2 erhälst du nur einen Pointer zu dem Dokument. Versuchs Doch einfach mal mit den SWX Standardbefehlen: Set swApp = Application.SldWorks Set Part = swApp.ActiveDoc Hierbei sind die Variabeln als Objects deklariert. Du erhälst also nicht nur den Pointer zurück, sondern die Datei als Objekt. Dann kannst Du auch mit ihr weiterarbeiten. Ich hoffe das stimmt so alles, wie ichs gesagt habe. War aber eher eine Vermutung. Hoffe es hat Dir trotzdem geholfen. Gruß, Markus ------------------  Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
doudou Mitglied Softwareentwicklung

 Beiträge: 13 Registriert: 17.09.2003
|
erstellt am: 04. Jul. 2005 20:44 <-- editieren / zitieren --> Unities abgeben:         
Hallo Ralph und Markus, zuerst vielen Dank für Eure Unterstützung. Unten ist das Code-Segment: ======================================================== STDMETHODIMP CQtFRAdapter::Load() { AFX_MANAGE_STATE(AfxGetStaticModuleState()) // TODO: Add your implementation code here TMapIUnknownToDocument::iterator iter; CComPtr<IModelDoc2> iModelDoc2; HRESULT hres = m_iSldWorks->get_IActiveDoc2 (&iModelDoc2); if (iModelDoc2 == NULL) { return S_FALSE; } iter = m_swDocMap.find(iModelDoc2); if (iter == m_swDocMap.end()) { return S_FALSE; } long docType = 0; iModelDoc2->GetType(&docType); if (docType != swDocPART) { return S_OK; } // load part and insert the new tab to the FeatureManagerView CComPtr<CSwPart> pDoc = NULL; pDoc.Attach ((CSwPart *)(*iter).second); if (pDoc->createAndAddTab () == true) { return S_OK; } else { return S_FALSE; } } ============================================================= Es scheint mir, dass das Problem am Makro "AFX_MANAGE_STATE(AfxGetStaticModuleState())" liegen könnte, den ich brauche für die MFC-Unterstützung. Wenn ich den Makro im Release Mode auskommetiere, dann läuft das Programm normal. Das gilt auch für andere Stellen. Schade! Ich weiß nicht, ob es eine Lösung gibt. Vielleicht wisst Ihr was. Nochmals vielen Dank! Viele Grüße! Jin
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
PASCAM Mitglied Diplom Informatiker

 Beiträge: 67 Registriert: 25.11.2002
|
erstellt am: 05. Jul. 2005 07:23 <-- editieren / zitieren --> Unities abgeben:          Nur für doudou
Hallo Jin, Ja, das koennte Dein Problem sein. Dein SWX -Pointer ist wohl nicht mehr korrekt (Geht wohl ueber Thread-Grenzen). Kannst Du Dir den SWX -Pointer als Paraemeter rueber geben lassen? Von wo wird diese Methode aufgerufen? Gruss, Ralph ------------------ PASCAM Ralph Müller Softwareentwicklung Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
waldi Mitglied Softwerker
 
 Beiträge: 272 Registriert: 07.08.2001 SW 2006 SP4
|
erstellt am: 05. Jul. 2005 08:15 <-- editieren / zitieren --> Unities abgeben:          Nur für doudou
Hi, versuch es mal damit: AFX_MANAGE_STATE(AfxGetAppModuleState()) Damit schaltest du in den Thread Kontext von SolidWorks. Ansonsten solltest du die Properties, die mit get_I.. anfange meiden, die machen ziemlich viel Ärger, vor allem wenn du nicht in einem Addin läufst, sonder von aussen auf SW zugreifst. Nimm in diesem Fall lieber GetActiveDoc, das ist die sichere Variante.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mkkk Mitglied
 
 Beiträge: 105 Registriert: 04.03.2005
|
erstellt am: 05. Jul. 2005 15:02 <-- editieren / zitieren --> Unities abgeben:          Nur für doudou
Zitat: Original erstellt von waldi: Hi,versuch es mal damit: AFX_MANAGE_STATE(AfxGetAppModuleState()) Damit schaltest du in den Thread Kontext von SolidWorks. Ansonsten solltest du die Properties, die mit get_I.. anfange meiden, die machen ziemlich viel Ärger, vor allem wenn du nicht in einem Addin läufst, sonder von aussen auf SW zugreifst. Nimm in diesem Fall lieber GetActiveDoc, das ist die sichere Variante.
Hi, get_IActiveDoc2() ist schon ok. Wir sind hier in einer ATL-COM-Server-Umgebung. GetActiceDoc() benutzt die Dispatch-Umgebung von Windows und ist hier völlig fehl am Platz. Im übrigen wird AFX_MANAGE_STATE(AfxGetAppModuleState()) nur benötigt, um in den eigenen Modul-Raum umzuschalten, wenn z.B. eigene Ressourcen wie Dialoge geöffnet werden. In diesem Fall kann man AFX_MANAGE_STATE(AfxGetAppModuleState()) einfach ausdokumentieren. Wenn AFX_MANAGE_STATE(AfxGetAppModuleState()) doch benötigt wird, so bitte nicht am Funktionsanfang definieren, sondern in einem eigenen Gültigkeitsblock: void MachWas() { // SolidWorks Ressourceraum { AFX_MANAGE_STATE(AfxGetAppModuleState()); // eigener DLL Ressourceraum // mach was mit Ressourcen // ... } // SolidWorks Ressourceraum } Gruß, Markus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
doudou Mitglied Softwareentwicklung

 Beiträge: 13 Registriert: 17.09.2003
|
erstellt am: 12. Jul. 2005 07:40 <-- editieren / zitieren --> Unities abgeben:         
Hallo alle zusammen, Das Programm läuft endlich. ich habe die Methode von Markus verwendet. Man sollte den Makro: AFX_MANAGE_STATE(AfxGetAppModuleState()); gezielt einsetzen. Viele Grüße und vielen Dank! Jin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |