auf Wave Resourcen und Funktionen einer DLL zugreifen



  • Hallo,

    ich habe eine DLL anhand diesen Beispielcodes erstellt: http://www.codeproject.net/dll/BeginnerDLL.asp#xx400164xx

    Jetzt möchte ich das ich wenn ich auf meinen Butten klicke, ein wave aus meiner der DLL abgespielt wirs.

    Hier ist der Code meiner DLL:
    Code:

    // asspeekClass.cpp: Implementierung der Klasse CasspeekClass. 
    // 
    ////////////////////////////////////////////////////////////////////// 
    
    #include "stdafx.h" 
    #include "stdafx.h" 
    #include "asspeekClass.h" 
    #include "asspeek.h" 
    
    #include <string.h> 
    #include <mmsystem.h> // winmm.lib mit linken ::PlaySound(MAKEINTRESOURCE(IDR_WELCOME), NULL, SND_RESOURCE | SND_ASYNC ); oder ::PlaySound("welcome.wav", NULL, SND_FILENAME | SND_ASYNC ); 
    
    #ifdef _DEBUG 
    #undef THIS_FILE 
    static char THIS_FILE[]=__FILE__; 
    #define new DEBUG_NEW 
    #endif 
    
    ////////////////////////////////////////////////////////////////////// 
    // Konstruktion/Destruktion 
    ////////////////////////////////////////////////////////////////////// 
    
    CasspeekClass::CasspeekClass() 
    { 
    
    } 
    
    CasspeekClass::~CasspeekClass() 
    { 
    
    } 
    
    CString CasspeekClass::SayHello(CString strName) 
    { 
       //Return the input string with a Hello prefixed 
       return "Hello " + strName; 
    } 
    CasspeekClass::playwave() 
    { 
       ::PlaySound(MAKEINTRESOURCE(IDR__welle), NULL, SND_RESOURCE | SND_SYNC ); 
       Sleep(500); 
    
    } 
    
    // asspeekClass.h: Schnittstelle für die Klasse CasspeekClass. 
    // 
    ////////////////////////////////////////////////////////////////////// 
    
    #if !defined(AFX_ASSPEEKCLASS_H__CF95936E_FA28_4B90_925B_9D918C166C90__INCLUDED_) 
    #define AFX_ASSPEEKCLASS_H__CF95936E_FA28_4B90_925B_9D918C166C90__INCLUDED_ 
    
    #if _MSC_VER > 1000 
    #pragma once 
    #endif // _MSC_VER > 1000 
    
    class CasspeekClass  
    { 
    public: 
       __declspec(dllexport) CString SayHello (CString strName); 
       __declspec(dllexport) playwave(); 
       __declspec(dllexport)CasspeekClass(); 
       __declspec(dllexport)virtual ~CasspeekClass(); 
    
    }; 
    
    #endif // !defined(AFX_ASSPEEKCLASS_H__CF95936E_FA28_4B90_925B_9D918C166C90__INCLUDED_) 
    
    hier ist der Code aus meinem Beispielbrogramm 
    Code: 
    
    CString CasspeekClass::SayHello(CString strName) 
    { 
       //Return the input string with a Hello prefixed 
       return "Hello " + strName; 
    } 
    CasspeekClass::playwave() 
    { 
       objasspeekClass.playwave(); 
    } 
    
    und hier mein header: 
    
    // testDLLDlg.h : Header-Datei 
    // 
    
    #if !defined(AFX_TESTDLLDLG_H__A8E6FDB9_67AF_49CA_8608_93B30E344DED__INCLUDED_) 
    #define AFX_TESTDLLDLG_H__A8E6FDB9_67AF_49CA_8608_93B30E344DED__INCLUDED_ 
    
    #if _MSC_VER > 1000 
    #pragma once 
    #endif // _MSC_VER > 1000 
    
    ///////////////////////////////////////////////////////////////////////////// 
    // CTestDLLDlg Dialogfeld 
    #include "..\asspeek\asspeekClass.h" // header Datei 
    
    class CTestDLLDlg : public CDialog 
    { 
    // Konstruktion 
    public: 
       CTestDLLDlg(CWnd* pParent = NULL);   // Standard-Konstruktor 
    
       CasspeekClass objasspeekClass; 
    // Dialogfelddaten 
       //{{AFX_DATA(CTestDLLDlg) 
       enum { IDD = IDD_TESTDLL_DIALOG }; 
       CString   m_edit; 
       //}}AFX_DATA 
    
       // Vom Klassenassistenten generierte Überladungen virtueller Funktionen 
       //{{AFX_VIRTUAL(CTestDLLDlg) 
       protected: 
       virtual void DoDataExchange(CDataExchange* pDX);   // DDX/DDV-Unterstützung 
       //}}AFX_VIRTUAL 
    
    // Implementierung 
    protected: 
       HICON m_hIcon; 
    
       // Generierte Message-Map-Funktionen 
       //{{AFX_MSG(CTestDLLDlg) 
       virtual BOOL OnInitDialog(); 
       afx_msg void OnSysCommand(UINT nID, LPARAM lParam); 
       afx_msg void OnPaint(); 
       afx_msg HCURSOR OnQueryDragIcon(); 
       afx_msg void OnSpeek(); 
       afx_msg void OnTest(); 
       //}}AFX_MSG 
       DECLARE_MESSAGE_MAP() 
    }; 
    
    //{{AFX_INSERT_LOCATION}} 
    // Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein. 
    
    #endif // !defined(AFX_TESTDLLDLG_H__A8E6FDB9_67AF_49CA_8608_93B30E344DED__INCLUDED_)
    

    ich erhalte keinen Fehler beim Kompilieren und auch nicht beim ausführen des Programmes. Das Wave wir aber nicht abgespielt.

    Den CString aus meiner DLL erhalte ich, weshalb es ja soweit zu funktionieren scheint. Was mache ich falsch?

    Ich wäre für jeden Tipp sehr dankbar!!!

    [ Dieser Beitrag wurde am 25.02.2003 um 09:54 Uhr von asmodia editiert. ]



  • Hallo,

    das mit den Klassen,Strings usw in ner dll abrufen habe ich jetzt gefunden und klappt ohne probleme.
    Mein Problem ist jezt nur noch das ich Waves in der dll abspielen möchte.

    verwende ich den Code in meiner dll um das Wave abzuspielen, funktioniert es. 
    
    ::PlaySound("welle.wav", NULL, SND_FILENAME | SND_ASYNC ); 
    
    nehme ich in meiner dll aber den Code den ich unbedingt brauche, da das Wave in meiner dll sein muss, funktioniert es nicht: 
    
    ::PlaySound(MAKEINTRESOURCE(IDR_welle), NULL, SND_RESOURCE | SND_ASYNC ); 
    
    da fällt bestimmt jemanden etwas zu ein, der mir bestimmt helfen kann.
    


  • Folgendes muss am Anfang jeder Funktion der DLL stehen:

    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    


  • Hallo,
    jetzt sieht mein Code so aus:

    CasspeekClass::playwave()
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    ::PlaySound(MAKEINTRESOURCE(IDR_welle), NULL, SND_RESOURCE | SND_ASYNC );
    Sleep(300);
    ::PlaySound("welle.wav", NULL, SND_FILENAME | SND_ASYNC ); 
    Sleep(300);
    }
    

    aber das wave aus MAKEINTRESOURCE(IDR_welle) wird nicht abgespielt sondern nur das ::PlaySound("welle.wav",

    ich habe die Klasse CasspeekClass von "Generic CWnd" abgeleitet, ist es dadurch vieleicht nicht möglich mit MAKEINTRESOURCE(IDR_welle) das Wave aus der DLL in in der DLL abzuspielen?

    [ Dieser Beitrag wurde am 25.02.2003 um 12:03 Uhr von asmodia editiert. ]



  • Das Instance-Handle der DLL muss noch angegeben werden. (2. Parameter)
    Bekommst du zum Beispiel über die DllMain.



  • ?? DLL Main

    In meiner dll kabe ich keine Main funktion.

    kann du mir einmal zeigen wie soetwas aussieht, dann kann ich auch noch über google nach dem suchen was du meinst.

    Vieleicht komme ich dann weiter.



  • Meinst du das so!

    CasspeekClass::playwave()
    {
    HINSTANCE hInstance = LoadLibrary("asspeel.dll");
    AfxSetResourceHandle(hInstance);
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    ::PlaySound(MAKEINTRESOURCE(IDR_welle), NULL, SND_RESOURCE | SND_ASYNC );
    Sleep(300);
    ::PlaySound("welle.wav", NULL, SND_FILENAME | SND_ASYNC ); 
    Sleep(300);
    }
    

    funktioniert aber auch nicht!



  • Ich kenne mich mit der MFC nicht aus, aber ich habe gerade gelesen das man die DllMain eigentlich nicht mehr braucht. Wenn dann google nach "DllMain" + "MFC". Über LoadLibrary funktioniert es auch. Du musst das Handle aber auch der Funtion PlaySound übergeben:

    ::PlaySound(MAKEINTRESOURCE(IDR_welle), hInstance, SND_RESOURCE | SND_ASYNC );
    

    [ Dieser Beitrag wurde am 25.02.2003 um 12:22 Uhr von Trolli editiert. ]



  • Ein kurzer Blick in die MSDN würde auch Dir weiterhelfen !!

    hmod
    Handle to the executable file that contains the resource to be loaded. This parameter must be NULL unless SND_RESOURCE is specified in fdwSound.

    --->

    CasspeekClass::playwave()
    {
      AFX_MANAGE_STATE(AfxGetStaticModuleState());
      ::PlaySound( MAKEINTRESOURCE(IDR_welle), AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC );
      Sleep(300);
      ::PlaySound("welle.wav", NULL, SND_FILENAME | SND_ASYNC ); 
      Sleep(300);
    }
    


  • Vielen Danke euch beiden!!

    das wars nun funktioniert es 🙂 🙂 🙂

    ich gucke in die MSDN und überall hin, aber ich habe nur 3 Stunden gepennt, und habe davor es 16 Stunden versucht zu progammieren.

    Ich habe schon hallos und rede mit mir selbst.

    ich bin oft sehr panne deswegen, weil ich es einfach übetreibe..

    Seit mir bitte nicht böse deswegen. DANKE



  • Glaubst du wir kenne das Problem (Müdigkeit) nicht.
    😉


Anmelden zum Antworten