Hallo zusammen,
ich habe die Aufgabe eine Software (in Delphi 7) in LabVIEW nachzuprogrammieren.
Diese Software beeinhaltet eine ziemlich aufwendige Maske zur Parametrierung des Versuches.
Diese Maske wurde in C++ geschrieben und ist in einer DLL aufrufbar.
Funktionsprototyp:
int CreateSpec(HINSTANCE hinst, HWND hwnd, ProfileData *g_SpecData, SpecDesign *g_SpecDesign);
Die Strukturen ProfileData und SpecDesign sind fuer mein jetziges Problem noch ohne Belang und duerfen auf NULL zeigen.
Das ganze funktioniert in der Delphi-Software problemlos. Bei Aufruf der DLL wird die C++ GUI ueber das Delphi GUI gelegt.
Ich habe Probleme dies mit LabVIEW nachzubilden. Die DLL antwortet mir immer mit dem Fehlercode fuer eine ungueltige HINSTANCE (Rueckgabewert = 1).
Ist es ueberhaupt moeglich von LabVIEW aus DLLs mit GUI zu starten? Ich habe hierzu keine Informationen finden koennen (wuesste aber auch nicht, warum das nicht gehen sollte ....).
Ich waere fuer jeden Tipp dankbar!
Meine Entwicklungsumgebung: LabVIEW 2011 auf Windows 7/64
Schoenen Gruss
Balze
(06.09.2012 09:47 )balze schrieb: [ -> ]Hallo zusammen,
ich habe die Aufgabe eine Software (in Delphi 7) in LabVIEW nachzuprogrammieren.
Diese Software beeinhaltet eine ziemlich aufwendige Maske zur Parametrierung des Versuches.
Diese Maske wurde in C++ geschrieben und ist in einer DLL aufrufbar.
Funktionsprototyp:
int CreateSpec(HINSTANCE hinst, HWND hwnd, ProfileData *g_SpecData, SpecDesign *g_SpecDesign);
Die Strukturen ProfileData und SpecDesign sind fuer mein jetziges Problem noch ohne Belang und duerfen auf NULL zeigen.
Das ganze funktioniert in der Delphi-Software problemlos. Bei Aufruf der DLL wird die C++ GUI ueber das Delphi GUI gelegt.
Ich habe Probleme dies mit LabVIEW nachzubilden. Die DLL antwortet mir immer mit dem Fehlercode fuer eine ungueltige HINSTANCE (Rueckgabewert = 1).
Ist es ueberhaupt moeglich von LabVIEW aus DLLs mit GUI zu starten? Ich habe hierzu keine Informationen finden koennen (wuesste aber auch nicht, warum das nicht gehen sollte ....).
Ich waere fuer jeden Tipp dankbar!
Meine Entwicklungsumgebung: LabVIEW 2011 auf Windows 7/64
Schoenen Gruss
Balze
Im Prinzip ist es zwar möglich, in der Praxis aber manchmal mit ziemlichen Problemen gepflastert. LabVIEW macht auf Windowsebene ziemlich heftige Klimmzüge um das zu tun was es eben tun soll. Mit Delphi kenne ich mich nicht so aus, aber ich kann mir gut vorstellen, dass die auf window management Ebene auch so einiges auf ihre eigene Weise tun. Das kann sich schon mal sehr unhübsch beissen mit der Weise wie LabVIEW sein internes window management abhandelt.
Grundsätzlich kannst Du aber mal versuchen um die Windows API Methode GetModuleHandle() aufzurufen und das damit erhaltene Handle als HINSTANCE zu übergeben. Möglicherweise funktioniert auch einfach NULL, da viele Funktionen das interpretieren um in diesem Fall selber GetModuleHandle() aufzurufen. Als nächstes kommt dann natürlich HWND welches wohl als Parent des dargestellten Dialogs fungiert. Auch hier ist NULL oft zulässig da dies dann als Desktop angesehen wird, der Dialog ist also Desktop modal, nicht unbedingt immer sehr praktisch aber zu Testzwecken auch wieder nicht so katastrophal. Später kannst Du immer noch mittels FindWindow() das Handle zu Deinem Hauptfenster abfragen und dieses als Parameter übergeben.
Hallo Rolf,
vielen Dank fuer Deine schnelle Antwort.
NULL als HINSTANCE zu verwenden habe ich bereits probiert. Leider mit dem gleichen Resultat (Rückgabewert = 1 -> fuer die C++ DLL ungueltige HINSTANCE).
Die WinAPI Funktion GetModuleHandleA liefert mir zwar meine HINSTANCE, aber auch die wird als ungueltig zurueckgewiesen. (Siehe Screenshot im ersten Beitrag) Kann man die gelieferte HINSTANCE irgendwie verifizieren? Ich habe leider nicht wirklich Ahnung von der WinAPI
Ich habe eine Testversion vom Hersteller der DLL bekommen um weiter testen zu koennen. Diese enthaelt zwei Versionen eines einfachen Dialogs.
Die erste Version benoetigt wie gehabt HINSTANCE und HWND, die zweite benoetigt nur HWND.
Version eins verhaelt sich wie gehabt -> ungueltige HINSTANCE
Die zweite Version funktioniert auf Anhieb und legt einen modalen Dialog auf mein VI (und schliesst diesen nicht wieder, so dass ich das VI schliessen muss, um das modale Overlay loszuwerden)
Evtl. wird die DLL entsprechend umgestrickt.
Schoener waere es eine "echte" Loesung finden zu koennen.
Danke und schoenen Gruss,
Balze
HAAAALT!!!
Problem geloest!
Ursache: PEBCAC
(Problem Exists Between Chair And Computer)
Mir ist eben ein klitzekleiner Rahmen ueber dem LabVIEW Menue (Ueber dem Datei Menueeintrag) aufgefallen.
Nach naeherer Untersuchung und Ruecksprache mit dem DLL Entwickler stellte sich heraus, dass die Parameter die ich auf NULL gesetzt habe fuer die Darstellung doch eine Rolle spielen.
Unter anderem ist darin der Startpunkt des Fensters und die Groesse (Breite und Hoehe) angegeben.
Per default ist das Fenster bei den Koordinaten 5,5 mit einer Groesse von 10,10 zu sehen. Das ist dann ein klitzekleines Fenster ueber dem Datei Menue
Beim zweiten Ausfuehren des VIs ist das Fenster natuerlich schon geoeffnet und die DLL meldet (auch) eine 1 zurueck.
Danke trotzdem fuer die Unterstuetzung.
MfG
Balze