Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  SolidWorks
  API get_IActiveDoc2

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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


Sehen Sie sich das Profil von doudou an!   Senden Sie eine Private Message an doudou  Schreiben Sie einen Gästebucheintrag für doudou

Beiträge: 13
Registriert: 17.09.2003

erstellt am: 01. Jul. 2005 19:13    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von PASCAM an!   Senden Sie eine Private Message an PASCAM  Schreiben Sie einen Gästebucheintrag für PASCAM

Beiträge: 67
Registriert: 25.11.2002

erstellt am: 01. Jul. 2005 22:37    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für doudou 10 Unities + Antwort hilfreich

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)


Sehen Sie sich das Profil von Atsam an!   Senden Sie eine Private Message an Atsam  Schreiben Sie einen Gästebucheintrag für Atsam

Beiträge: 199
Registriert: 22.11.2004

SolidWorks Office Premium 2010 x64 Edition, SP 5.0

erstellt am: 04. Jul. 2005 06:50    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für doudou 10 Unities + Antwort hilfreich

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 SWXSolidWorks 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


Sehen Sie sich das Profil von doudou an!   Senden Sie eine Private Message an doudou  Schreiben Sie einen Gästebucheintrag für doudou

Beiträge: 13
Registriert: 17.09.2003

erstellt am: 04. Jul. 2005 20:44    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von PASCAM an!   Senden Sie eine Private Message an PASCAM  Schreiben Sie einen Gästebucheintrag für PASCAM

Beiträge: 67
Registriert: 25.11.2002

erstellt am: 05. Jul. 2005 07:23    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für doudou 10 Unities + Antwort hilfreich

Hallo Jin,

Ja, das koennte Dein Problem sein. Dein SWXSolidWorks-Pointer ist wohl nicht mehr korrekt (Geht wohl ueber Thread-Grenzen).
Kannst Du Dir den SWXSolidWorks-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


Sehen Sie sich das Profil von waldi an!   Senden Sie eine Private Message an waldi  Schreiben Sie einen Gästebucheintrag für waldi

Beiträge: 272
Registriert: 07.08.2001

SW 2006 SP4

erstellt am: 05. Jul. 2005 08:15    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für doudou 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von mkkk an!   Senden Sie eine Private Message an mkkk  Schreiben Sie einen Gästebucheintrag für mkkk

Beiträge: 105
Registriert: 04.03.2005

erstellt am: 05. Jul. 2005 15:02    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für doudou 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von doudou an!   Senden Sie eine Private Message an doudou  Schreiben Sie einen Gästebucheintrag für doudou

Beiträge: 13
Registriert: 17.09.2003

erstellt am: 12. Jul. 2005 07:40    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2024 CAD.de | Impressum | Datenschutz