May 2, 2012

MaPet MaPet
Lab Rat
27 posts

Prozedureinsprungspunkt nicht gefunden

 

hy
ich habe eine c++ win32 app(mit VS2010 geschieben) und eine gui, die ich mit qt geschieben haben als dll.
ich möchte nun die dll von meiner win32 app ausführen und bekomme folgende fehlermeldung.
“der prozedureinsprungspunkt ??0QtStatusBar@@QAE@PAVQWidget@@@Z” wurde in der DLL QtGuid4.dll nicht gefunden!

alle notwendigen dlls liegen direkt neben meiner exe file.
so rufe ich meine dll auf:

  1. typedef double (*BinaryFunction_t) (int, char*) ;
  2.  
  3. int CallMyDLL (void)
  4. {
  5.     BinaryFunction_t  AddNumbers  ;
  6.     double            result      ;
  7.     bool              fFreeResult ;
  8.  
  9.     // DLL Datei laden
  10.     HINSTANCE hinstLib = LoadLibrary (TEXT("C:\\workspace\\TestProject\\gui3\\Debug\\gui1.dll"));
  11.  
  12.     if (hinstLib != NULL)
  13.     {
  14.         // Die Einsprungadresse abfragen
  15.         AddNumbers = (BinaryFunction_t) GetProcAddress (hinstLib, "main") ;
  16.  
  17.         // Die Funktion aufrufen
  18.         if ( AddNumbers != NULL )
  19.             result = (*AddNumbers) (1, "this is a test") ;
  20.  
  21.         // Die DLL-Datei wieder entladen
  22.         fFreeResult = FreeLibrary (hinstLib) ;
  23.     }
  24.  
  25.     return 0 ;
  26. }
  27.  
  28. int _tmain(int argc, _TCHAR* argv[])
  29. {
  30.  CallMyDLL();
  31.  return 0;
  32. }

3 replies

May 3, 2012

Gerolf Gerolf
Robot Herder
3235 posts

Benötigte Dlls werden nicht bei einer zu ladenden Dll gesucht, sondern bei der exe, im windows system und im suchpfad.

Unter windows gibt es einen API aufruf umn das zu erweitern: SetDllDirectoryW: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686203(v=vs.85).aspx

 Signature 

Nokia Certified Qt Specialist.
Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

May 3, 2012

MaPet MaPet
Lab Rat
27 posts

hallo,

MaPet wrote:
hy
alle notwendigen dlls liegen direkt neben meiner exe file.

oder meintest du, dass ich den QtSDK lib folder mit SetDllDirectoryW angeben soll?

July 7, 2012

franku franku
Lab Rat
135 posts

Hallo, ich zeige mal zwei minimale Projekte, die zusammen bei mir laufen. Vielleicht hilft das weiter, auch wenn ich noch nicht genau weiß, was Du vorhast. Ich habe allerdings alles mit MinGW/QtCreator gebaut, ohne VS zu verwenden.

Ich habe einfach ein MainWindow mit dem Designer erstellt und das in der dll gestartet. Die nicht-Qt App lädt die dll genauso, wie es oben steht und startet mit dem AddNumbers() das MainWindow.

Im Debug-Verzeichnis von dll-test1 stehen bei mir folgende Dateien:

  • dll-test1.exe (die nicht Qt-App)
  • gui1.dll (manuell kopiert aus dem Verzeichnis des dll- debug build)
  • libgcc_s_sjlj-1.dll (manuell kopiert aus mingw64)
  • main.o (ist nicht mehr wichtig)
  • QtCored4.dll (manuell kopiert aus der Qt-Toolchain)
  • QtGuid4.dll (manuell kopiert aus der Qt-Toolchain)

1.) Für die DLL:

gui1.pro

  1. TARGET = gui1
  2. TEMPLATE = lib
  3.  
  4. DEFINES += GUI1_LIBRARY
  5.  
  6. SOURCES += gui1.cpp
  7.  
  8. HEADERS += gui1.h\
  9.     ui_mainwindow.h
  10.  
  11. FORMS += \
  12.     mainwindow.ui

gui1.h

  1. #ifndef GUI1_H
  2. #define GUI1_H
  3.  
  4. #include <QtCore/qglobal.h>
  5.  
  6. #if defined(GUI1_LIBRARY)
  7. #  define GUI1SHARED_EXPORT Q_DECL_EXPORT
  8. #else
  9. #  define GUI1SHARED_EXPORT Q_DECL_IMPORT
  10. #endif
  11.  
  12. GUI1SHARED_EXPORT int main(int argc, char* argv[]);
  13.  
  14. #endif // GUI1_H

gui1.cpp

  1. #include "gui1.h"
  2. #include "ui_mainwindow.h"
  3.  
  4. #include <QApplication>
  5.  
  6. int main(int argc, char *argv[])
  7. {
  8.     QApplication app(argc, argv);
  9.  
  10.     QMainWindow window;
  11.     Ui::MainWindow ui;
  12.  
  13.     ui.setupUi(&window);
  14.     window.show();
  15.  
  16.     app.exec();
  17. }

2.) Für die (nicht-qt) Application:

dll-test1.pro

  1. TEMPLATE = app
  2. CONFIG += console
  3. CONFIG -= qt
  4.  
  5. SOURCES += main.cpp

dll-test1.cpp

  1. #include <windows.h>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. typedef double (*BinaryFunction_t) (int, char*) ;
  7.  
  8. int CallMyDLL (void)
  9. {
  10.     BinaryFunction_t  AddNumbers  ;
  11.     double            result      ;
  12.     bool              fFreeResult ;
  13.  
  14.     // DLL Datei laden
  15.     HINSTANCE hinstLib = LoadLibrary (TEXT("gui1.dll"));
  16.  
  17.     if (hinstLib != NULL)
  18.     {
  19.         // Die Einsprungadresse abfragen
  20.         AddNumbers = (BinaryFunction_t) GetProcAddress (hinstLib, "main") ;
  21.  
  22.         // Die Funktion aufrufen
  23.         if ( AddNumbers != NULL )
  24.             result = (*AddNumbers) (1, (char*)"this is a test") ;
  25.  
  26.         // Die DLL-Datei wieder entladen
  27.         fFreeResult = FreeLibrary (hinstLib) ;
  28.     } else {
  29.         cout << "Could not load dll" << endl;
  30.     }
  31.  
  32.     return 0 ;
  33. }
  34.  
  35.  
  36. int main(int argc, char *argv[])
  37. {
  38.     CallMyDLL();
  39.     return 0;
  40. }

 Signature 

Keep in mind: This, Jen, is the internet.
.. frank

 
  ‹‹ [Solved]TrayIcon in anderer Klasse als das Mainwindow      Qt Project @ LinuxTag 2012 ››

You must log in to post a reply. Not a member yet? Register here!