Dll-Problem



  • also meine DLL sieht so aus..

    //---------------------------------------------------------------------------
    
    #include <windows.h>
    //---------------------------------------------------------------------------
    #pragma argsused
    
    #define LIB_IMPORT __declspec(dllimport)
    #define LIB_EXPORT __declspec(dllexport)
    
    extern "C"  _stdcall int Callback(){
    return 1;
    }
    
    //---------------------------------------------------------------------------
    

    und das hauptprogramm sieht so aus

    //---------------------------------------------------------------------------
    
    #pragma hdrstop
    //PROCESS_ALL_ACCESS
    //HANDLE GetProcessHandle( std::string strProcessExe, DWORD dwDesiredAccess )
    #include <windows.h>
    #include "GetProc.h"
    #include <iostream>
    
    //---------------------------------------------------------------------------
    
    #pragma argsused
    
    typedef DWORD WINAPI (CALLBACK* LPFNDLLFUNC1) (HANDLE);
    typedef _stdcall int (*LPFNDLLFUNC2) ();
    class LoadLibary{
    public:
    LoadLibary();
    ~LoadLibary();
    LPFNDLLFUNC1 GetProcessId;
    
    LPFNDLLFUNC2 Callback;
    
    private:
    HINSTANCE hDLL_1;
    HINSTANCE hDLL_2;
    };
    
    LoadLibary::LoadLibary(){
    hDLL_1 = LoadLibrary("Kernel32.dll");
    if (hDLL_1 != NULL)
      {
       GetProcessId = (LPFNDLLFUNC1)GetProcAddress(hDLL_1,"GetProcessId");
       if (!GetProcessId)
       {
         FreeLibrary(hDLL_1);
         GetProcessId = NULL;
         hDLL_1 = NULL;
       }
      }
    hDLL_2 = LoadLibrary("Project1.dll");
    if (hDLL_2 != NULL)
      {
       Callback = (LPFNDLLFUNC2)GetProcAddress(hDLL_2,"Callback");// Callback ist immer NULL!
       if (!Callback)
       {
         FreeLibrary(hDLL_2);
         Callback = NULL;
         hDLL_2 = NULL;
       }
      }
    }
    
    LoadLibary::~LoadLibary(){
    FreeLibrary(hDLL_1);
    FreeLibrary(hDLL_2);
    }
    
    // Instanz zum Aufrufen der Funktionen.
    LoadLibary Libary;
    
    int main(int argc, char* argv[])
    {
    //typedef int (FAR WINAPI *FARPROC)();
    HANDLE hProcc = GetProcessHandle("firefox.exe",PROCESS_ALL_ACCESS);
    DWORD dwProcc = Libary.GetProcessId(hProcc);
    HANDLE hHooked = SetWindowsHookEx(WH_CALLWNDPROC,Libary.Callback,NULL,dwProcc);
    if ( !hHooked ){
    std::cout << "Error: "<<GetLastError()<<std::endl;
    }
           return 0;
    }
    //---------------------------------------------------------------------------
    

    Mein problem ist jetzt das Callback immer Null ist <.< und ich find nicht raus wieso, eigentlich sollte er ja die funktion in der DLL finden, weil die DLL selbst hat er gefunden.



  • Wenn du schon LIB_EXPORT definierst, solltest du es bei der Deklaration von Callback() auch einsetzen, oder?



  • Warsch. ^^ aber ich hab ne ausrede 😉
    Hab nen richtiges tut gesucht wie man ne dll schreibt und leider nicht nur in google kein für mich funktionierendes gefunden sondern zudem auch hier im forum nicht 😃 also bin ich da noch recht deletantisch



  • Gute Ausrede. :p

    Schau doch mal in der MSDN, da werden DLLs auch recht gut erklärt.



  • Dieser Thread wurde von Moderator/in Phoemuex aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Nexus schrieb:

    Gute Ausrede. :p

    Schau doch mal in der MSDN, da werden DLLs auch recht gut erklärt.

    Erklärt ja, aber konkrete zusammenhengende beispiele sind da selten

    => http://msdn.microsoft.com/de-de/library/1ez7dh12.aspx



  • Schurke schrieb:

    Nexus schrieb:

    Gute Ausrede. :p

    Schau doch mal in der MSDN, da werden DLLs auch recht gut erklärt.

    Erklärt ja, aber konkrete zusammenhengende beispiele sind da selten

    => http://msdn.microsoft.com/de-de/library/1ez7dh12.aspx

    Hast du denn auch alle unten stehenden Links gelesen? 😉



  • Hallo.

    Was'n das für'n Durcheinander!? GetProcId ist eine Funktion und keine Variable! Schreib mal überall m_ vor die Variablen, Konstruktoren usw.! Das ist dann schon mal ein Anfang.

    Gruß

    Lars



  • chezzmatazz tue mirn gefallen und hdf k thx bye



  • ... ich hab mich verhauen. Sorry. GetProcessId steht da ja. Wie komme ich da wieder raus?

    Callback = (LPFNDLLFUNC2)GetProcAddress(hDLL_2,"Callback");

    Wenn hDll_2 != NULL; ist, muss der Name der Funktion falsch sein. Selbst MS kann einem da ein Bein stellen. Mit falschen Dokumentationen! Alles schon erlebt.

    Hast du eine LIB zur DLL? Mach mal im (Text-)Editor auf das Ding (die LIB). Es sieht zwar auf den ersten Blick komisch aus, auf den zweiten Blick aber nicht mehr. Da steht dann der konkrete Name (mit Ausschmückungen wie z.B. !"§ProcName%&/).

    Gruss

    Lars



  • chezzmatazz schrieb:

    Wenn hDll_2 != NULL; ist, muss der Name der Funktion falsch sein.

    😮

    @Schurke:
    Prüf einfach mal mit einem "Dependency Walker" o.ä. ob und wieviele Funktionen die eigene DLL enthält und deren genaue Schreibweise.



  • Ähm... was wird denn hier noch diskutiert? Er hat die Funktion Callcack() nicht exportiert. Logisch, dass er sie nicht per GetProcAddress findet. Mehr gibt's doch nicht zu sagen, oder?

    P.S.: chezzmatazz, m_ vor die Konstruktoren schreiben? 😕 😮



  • _matze schrieb:

    Ähm... was wird denn hier noch diskutiert? Er hat die Funktion Callcack() nicht exportiert. Logisch, dass er sie nicht per GetProcAddress findet. Mehr gibt's doch nicht zu sagen, oder?

    P.S.: chezzmatazz, m_ vor die Konstruktoren schreiben? 😕 😮

    Das reale problem hier ist das er nicht weiß wie man es exportiert.
    ( Das ich 😉 )

    //Edit
    Also gut, habs hingekriegt.

    Mit

    extern "C" __declspec( dllexport ) int __stdcall Callback(){
    //Code...
    return 1;
    }
    

    danke für den tipp mit depency walker

    Jedoch...

    jetzt hab ich ein neues problem, und zwar liefer mir sobald

    extern "C" __declspec( dllexport ) LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam ){
    //Log.open("F:\\Log.txt");
    CWPSTRUCT * cwStrct = (CWPSTRUCT *)lParam;
    if ( cwStrct->message == WM_CREATE  ){
      CREATESTRUCT * cInfo = (CREATESTRUCT *)wParam;
      //Log.seekp(ios::end);
      //Log.write(cInfo->lpszName,strlen(cInfo->lpszName));
      //Log.write("\n",1);
      //Log.close();
      if ( cInfo->lpszName != NULL )MessageBox(NULL,cInfo->lpszName,"Info",MB_OK);
      }
    return CallNextHookEx(NULL,nCode,wParam,lParam);
    }
    

    aufgerufen wird mein system "Fehler 1400 wrong window handle" und der prozess von dem der WM Create stammt stürzt ab ^^


Anmelden zum Antworten