| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
| Innovationstag mit SolidCAM und Plogmann bei HEDELIUS in Meppen |
Autor
|
Thema: API: Vorschau-Bitmap extrahieren... diesmal x64 (2260 mal gelesen)
|
ChrisB Mitglied
Beiträge: 61 Registriert: 14.03.2005 SolidWorks 2006/2008 WinXP Pro MS VS 2005
|
erstellt am: 11. Aug. 2008 15:04 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute! Bisher verwende ich die gute alte SldWorks_ExtractBitmap Bibliothek um mir die Vorschau-Bildchen aus SolidWorks Dateien zu holen. Nun hab ich leider das Problem, dass meine Tools auch auf 64-bit Rechnern laufen sollen, und da fängt es an zu haken. Dank .NET Framework laufen meine Tools an sich wunderbar auch auf x64. Aber ein Problem hab ich: Ich kann keine "vorkompilierten" 32-bit DLL-Dateien (wie eben diese Bibliothek) in meinen Programmen laden. Nun meine Frage: Habt ihr ähnliche Probleme? Und wenn ja: wie habt ihr die gelöst? Bin mal gespannt Grüße Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 11. Aug. 2008 15:49 <-- editieren / zitieren --> Unities abgeben: Nur für ChrisB
Hallo Christian, das Extrahieren der Previewbitmaps wird mittlerweile mit dem jetzt auch dokumentierten und offiziell unterstützten SolidWorks Document Manager gemacht, ist alles im API Hilfefile beschrieben inkl. einem Beispiel um das Vorschaubild als PNG zu extrahieren. Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Stefans SolidWorks Blog Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ChrisB Mitglied
Beiträge: 61 Registriert: 14.03.2005 SolidWorks 2006/2008 WinXP Pro MS VS 2005
|
erstellt am: 11. Aug. 2008 16:16 <-- editieren / zitieren --> Unities abgeben:
|
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 11. Aug. 2008 16:25 <-- editieren / zitieren --> Unities abgeben: Nur für ChrisB
Kein Problem, du kannst den SwDocumentMgr.dll auch von einer externen Echse schlucken lassen und darfst die DLL mit deiner Anwendung packen und weitergeben. Du brauchst nur einen eigenen Schlüssel, der dir von den SolidWorks API Leuten zugeschickt wird. Mailadresse steht auch in der Hilfedatei. Wie sich das ganze allerdings auf 64 Bit Systemen verhält kann ich mangels eigenem Rechner zum Testen nicht sagen, aber ich geh mal davon aus, dass es diese DLL auch in 64 Bit gibt, wäre ja nur logisch. Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Stefans SolidWorks Blog Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ChrisB Mitglied
Beiträge: 61 Registriert: 14.03.2005 SolidWorks 2006/2008 WinXP Pro MS VS 2005
|
erstellt am: 12. Aug. 2008 08:21 <-- editieren / zitieren --> Unities abgeben:
Moin! Das Schlucken ist kein Problem. Ich kann die DLL auch auf 64-bit Rechnern problemlos ansprechen, einbinden und instanzieren. Der Aufruf von pBitmap = SwDMConfiguration7.GetPreviewPNGBitmap ( result) liefert allerdings immer "nothing" zurück (mit Fehler 2). Alles andere, wie Konfig-Namen anzeigen etc. funktioniert einwandfrei... Zuerst dachte ich, dass es daran liegt: Remarks This method does not work in out-of-process and in some ASP.NET/IIS web applications. Allerdings muss ich dazu sagen dass nicht einmal das Beispiel-Makro, das in der API dabei ist, jemals funktioniert hat und mir das Bild geliefert hat. Ich bin mittleweile ziemlich ratlos. Es bleibt immernoch der workaround die Anwendung als x32 zu kompilieren und gute alte DLL weiterhin zu verwenden, auch wenn das absolut unbefriedigend ist... Trotzdem Danke für die Hilfe! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mkkk Mitglied
Beiträge: 105 Registriert: 04.03.2005
|
erstellt am: 12. Aug. 2008 08:23 <-- editieren / zitieren --> Unities abgeben: Nur für ChrisB
|
ChrisB Mitglied
Beiträge: 61 Registriert: 14.03.2005 SolidWorks 2006/2008 WinXP Pro MS VS 2005
|
erstellt am: 12. Aug. 2008 08:29 <-- editieren / zitieren --> Unities abgeben:
Moin mkkk! An sich eine gute Idee! Die Sache hat nur einen Haken: es funktioniert nicht, weil mein Programm zwingend als .EXE laufen muss. Aber die "Remarks" bei dieser API sind sehr informativ und erklären auch, warum der swDocumentMgr nur "in-process" das Bild liefern kann: Remarks NOTE: Currently, only in-process applications (that is, macros or add-ins) can use this method; out-of-process applications (that is, executables) will get an automation error because the IPictureDisp interface cannot be marshalled across process boundaries. This is a Microsoft behaviour by design. See the Microsoft Knowledge Base for details. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 12. Aug. 2008 10:21 <-- editieren / zitieren --> Unities abgeben: Nur für ChrisB
Hallo Chris, brauchst du denn die konfigurationsspezifische Vorschau? Ich nutz in meinem PAC4SWX die SwDMDocument10::GetPreviewBitmap, das funktioniert einwandfrei mit dem standalone Programm. Wenn ich Gelegenheit habe schau ich mal wie es mit den konfigurationsspezifischen Bildern ist, wenn es out-of-process nicht klappt hat es nicht smit 32 oder 64 Bit zu tun, sondern dürfte auch auf "normalem" Windows XP nicht funktionieren. Auf der anderen Seite hat die SwDMDocument10::GetPreviewBitmap ja auch dieser Remark dabei und es klappt trotzdem ... Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Stefans SolidWorks Blog Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ChrisB Mitglied
Beiträge: 61 Registriert: 14.03.2005 SolidWorks 2006/2008 WinXP Pro MS VS 2005
|
erstellt am: 12. Aug. 2008 13:32 <-- editieren / zitieren --> Unities abgeben:
Ha! Ich hatte noch die 2007er Version der swDocumentMgr.dll. Da gab es noch kein Document10 und daher auch nicht diese Methode der Bitmap-Gewinnung. Danke schonmal für den Tip! Denn die konfigurationsspezifische Vorschau interessiert mich (vorerst) nicht. Allerdings hat sich mein Problem nicht wirklich geändert. Dafür ist es jetzt interessanter Wenn ich nämlich nun auf einem 64-bit Rechner das ganze starte passiert folgendes: Code: Dim swDoc As SwDMDocument Dim swDoc6 as SwDMDocument6 Dim swDoc7 as SwDMDocument7 Dim swDoc8 as SwDMDocument8swDoc = myDocMgr.GetDocument(FileName, docType, True, Result) swDoc6 = swDoc 'OK swDoc7 = swDoc 'OK swDoc8 = swDoc 'Fehler!
Fehlermeldung: Unable to cast COM object of type 'System.__ComObject' to interface type 'SwDocumentMgr.SwDMDocument10'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{5C23AE78-4008-46C9-AABB-03D29889BE77}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).
Es ist interessant zu sehen dass das Casten bis SwDMDocument7 problemlos funktioniert. Meine erste Vermutung war, dass ich auf dem Remote-PC eine alte DLL installiert hatte. Das konnte ich allerdings ausschließen. Wie gesagt, das Problem tritt nur auf 64-bit Rechnern auf, und nur dann, wenn ich meine Application nicht explizit für 32-bit kompiliere. Darf ich dich fragen wie du das bei PAC4SWX gelöst hast? Da funktionierts nämlich. (ich vermute das Programm wird für x86 kompiliert) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 12. Aug. 2008 14:16 <-- editieren / zitieren --> Unities abgeben: Nur für ChrisB
Hallo Chris, puh, gut zu hören, dass PAC4SWX auf den 64 Bit Büchsen läuft, wie gesagt, ich hab keine zum Testen im Moment ... Nachdem ich herausgefunden hatte (durch Try and Error) dass die Nummern im Gegensatz zu "normalem" SolidWorks keine Upgrades sind (d.h., ob ich ModelDoc oder ModelDoc2 sag ist wurscht, aber nicht ob ich SwDMDocument7 oder SwDMDocument10 nutze) hab ich die "kleineren" nie probiert sondern direkt die 10 genommen: Code: Dim swClassFact As SwDocumentMgr.SwDMClassFactory Dim swDocMgr As SwDocumentMgr.SwDMApplication Dim swDoc As SwDocumentMgr.SwDMDocument10 Dim pPreview As IPictureDisp [...] Set swDoc = swDocMgr.GetDocument(sldFilename, SWXTypeOfFile(sldFilename), False, nRetVal) ' das Bild holen If Not swDoc Is Nothing Then Set pPreview = swDoc.GetPreviewBitmap(nRetVal) [...]
Das ganze ist in VB6 geschrieben und ohne Kompilieroptionen erstellt. Mitliefern tue ich die SW2008 SP3.0 SwDocumentMgr.dllWie gesagt, was und wo das bei .NET oder 64 Bit noch verborgene Problemchen schlummern weiß ich nicht, bisher konnte ich mich noch nicht aufraffen, meine VB-Projekte in .NET neu zu schreiben. Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Stefans SolidWorks Blog Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ChrisB Mitglied
Beiträge: 61 Registriert: 14.03.2005 SolidWorks 2006/2008 WinXP Pro MS VS 2005
|
erstellt am: 14. Aug. 2008 08:56 <-- editieren / zitieren --> Unities abgeben:
Sooo, da bin ich wieder. Ich hab mittlerweile alle Probleme (und davon gabs einige) in den Griff bekommen. Nun hab ein schönes Control, dass asynchron die Vorschau lädt ohne auf SWX zuzugreifen und sowohl mit 32 als auch 64 bit applications läuft. Damit nicht jeder das Rad neu erfinden muss, sag ich kurz was zu den Problemchen: - Der Befehl swDoc11.GetPreviewBitmapBytes(BitmapResult) arbeitet unterschiedlich für 32- und die 64-bit Version der swDocumentMgr.dll Zumindest bei mir ist es so, dass die 32-bit Version eine 32-bit (8 bit für je R,G,B,A) Bitmap zurückgibt, während die 64-bit Version lediglich eine 24-bit (R,G,B) Bitmap liefert. In dem Byte-Feld, das von diesem Befehl geliefert wird, ist ein Fehler, der bewirkt dass der Header der Bitmap größer angezeigt wird, als das gesamte Byte-Feld eigentlich lang ist (das Byte 13 ist fälschlicherweise NICHT 0). Wenn man dieses Byte von Hand auf 0 setzt, lässt sich die Bitmap problemlos erzeugen. (Um das rauszufunden war ganz schön viel Knobelei notwendig...) Mögen diese Infos dem Nächsten, der sich damit rumplagt, helfen. Grüße Chris Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gegy3 Mitglied
Beiträge: 300 Registriert: 26.04.2006 SolidWorks 2012 SP 5.0
|
erstellt am: 10. Aug. 2009 19:59 <-- editieren / zitieren --> Unities abgeben: Nur für ChrisB
|