| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | | | PLM TechnologieForum Leipzig |
Autor
|
Thema: LPDISPATCH (781 mal gelesen)
|
anki Mitglied
Beiträge: 25 Registriert: 26.01.2007
|
erstellt am: 28. Feb. 2007 17:24 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe hier ein kleines Problem, dass für euch sicherlich ganz einfach zu lösen ist. Ich möchte eine .dll mit C++ schreiben. Hier ein Stück von meinem Code:
Code:
CComPtr<IModelDocExtension> swExtension; CComPtr<ISelectionMgr> SelectionManager; CComPtr<IMathTransform> Xform; //LPMATHTRANSFORM LPDISPATCH CurComponent=NULL; CComPtr<IComponent2> Component; double* TransArray[4][4]; VARIANT_BOOL selOK, Retval; HRESULT hres = NOERROR; // Auswahl eines Bauteils hres = swModel->get_Extension(&swExtension); hres = swExtension->SelectByID2(_T("Sonnenrad-1@Planetengetriebe"), _T("COMPONENT"), 0.005339457775965, -0.003051118729123, 0, False, 0, 0, 0, &selOK); if (selOK == TRUE) { hres = swModel->get_ISelectionManager(&SelectionManager); hres = SelectionManager->GetSelectedObject6 ( 1, 0, &CurComponent); } else ::MessageBox(NULL, _T("Error"), _T("Could not select object!"), MB_OK); IComponent2 Component(CurComponent); hres = Component->get_Transform2 ( &Xform ); hres = Xform->get_IArrayData ( &TransArray );
Die Funktion GetSelectedObject6() liefert ein LPDISPATCH CurComponent zurück. Auf dieses kann ich aber die Funktion get_Transform2 nicht aufrufen. Ich muss es also irgendwie in ein Component2-Objekt umwandel (oder?). Die Frage ist nur wie? Die Zeile: Code: IComponent2 Component(CurComponent);
habe ich in der API-Hilfe gefunden, aber das funktioniert bei mir nicht. Außerdem habe ich noch ein kleines Problem mit get_IArrayData. In der Hilfe steht, dass der Rückgabewert double* ist. Ich habe die Matrix ja auch so angelegt, bei Kompilieren erhalte ich dann aber folgende Fehlermeldung: Zitat: SldWorks::IMathTransform::get_IArrayData': Konvertierung des Parameters 1 von 'double (*__w64 )[4][4]' in 'double *' nicht möglich Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
Was habe ich da falsch gemacht?Viele Grüße Anne
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 28. Feb. 2007 18:02 <-- editieren / zitieren --> Unities abgeben: Nur für anki
|
anki Mitglied
Beiträge: 25 Registriert: 26.01.2007
|
erstellt am: 28. Feb. 2007 18:08 <-- editieren / zitieren --> Unities abgeben:
|
Brummbaer Mitglied Student / Maschinenbau
Beiträge: 28 Registriert: 25.11.2004
|
erstellt am: 02. Mrz. 2007 18:06 <-- editieren / zitieren --> Unities abgeben: Nur für anki
Hallo, schau Dir in der API-Hilfe dieses Beispiel an: Access Assembly Example (C++ COM). Es zeigt Dir eine mögliche Lösung für Dein erstes Problem. Ich hatte Dein zweites Problem in ähnlicher Weise, ich habe dann die Safearray-Vorlage von SWX genutzt, Du findest es im folgenden API-Beispiel: Get Spline Points Example (C++ COM). mfg Steffen
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Elektroingenieur (m/w/d) | Menschen und Technologien zu verbinden, den Perfect Match für unsere Kunden zu gestalten, immer die richtigen Expert:innen für die jeweilige Herausforderung zu finden - das ist unser Anspruch bei FERCHAU und dafür suchen wir dich: als ambitionierte:n Kolleg:in, der:die wie wir Technologien auf die nächste Stufe bringen möchte. Wir realisieren spannende Projekte für namhafte Kunden in den Technologiebereichen ... | Anzeige ansehen | Elektrotechnik, Elektronik |
|
anki Mitglied
Beiträge: 25 Registriert: 26.01.2007
|
erstellt am: 05. Mrz. 2007 14:04 <-- editieren / zitieren --> Unities abgeben:
Hallo Steffen, vielen Dank für deine Antwort. Das erste Problem hatte sich schon erledigt, aber für das zweite war deine Antwort sehr hilfreich. Es funktioniert jetzt. Aber vielleicht kannst du mir noch bei einem anderen Problem weiter helfen. Ich will mit Hilfe von GetComponents Name und Transform-Matrix von allen Bauteilen einer Datei auslesen. Das Problem ist bei mir die Rückgabe des Arrays, in dem die Objekte der Bauteile enthalten sein sollen. Ich kann irgendwie nur auf das erste Objekt zugreifen und das hat auch noch einen sehr merkwürdigen Namen. Hier ist der Code:
Code:
long CompCount; IComponent2** Comp; BSTR CompName;hres = swAssy->GetComponentCount(TRUE, &CompCount); std::cout << CompCount << "\n"; if (hres!=S_OK) std::cout << "Could not count Components!\n" << "hres: " << hres << "\n"; else { // Dynamisches Array für Bauteile anlegen Comp = new IComponent2*[CompCount]; //----------------------------- Bauteile ermitteln -----------------------------// hres = swAssy->IGetComponents(TRUE, CompCount, Comp); if (hres!=S_OK ) std::cout << "GetComponents failed!\n"; else { std::cout << "Got Components!\n"; // Für jedes Bauteil den Namen und die Transformationsmatrix auslesen und an Client senden for (long i = 0; i<CompCount; i=i+1) { CComPtr<IMathTransform> Xform; //LPMATHTRANSFORM hres = Comp[i]->get_Name2(&CompName ); std::cout << "CompName " << i << ": " << CompName << "\n"; hres = Comp[i]->get_Transform2(&Xform ); hres = Xform->get_IArrayData(TransArray ); std::cout << "TransArray " << i << ": \n"; for (int zeile=0; zeile<16;zeile=zeile+1) { std::cout << TransArray[zeile] << " "; std::cout << "\n"; } } } }
Und im Anhang findest du ein Bild von der Ausgabe. Ich denke, es ist irgendwie ein Problem mit den Zeigern, aber ich komm einfach nicht dahinter Ich hoffe, du oder jemand anderes kann mir weiter helfen.Viele Grüße Anne Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|