Windows API, odtwarzanie plików WAV, problem z nazwą pliku

0

Hej! Mam pewien problem z biblioteką DLL...
Obudowałem funkcje PlaySound (w celach testowych) no i niestety nie działa... Zamiast nazwy pliku to przekazywane są kwadraciki... Biblioteka kompilowana w MS Visual Studo 2010 C++ (jako natywna)

Kod biblioteki dll

 
MUZYKADLL_API void odtwarzajWAV(LPCTSTR plikWAV, bool czyZapetlic)
{

	if (czyZapetlic == true)
	{
		PlaySound(plikWAV, NULL, SND_FILENAME || SND_LOOP);
	}
	else
	{
		PlaySound(plikWAV, NULL, SND_FILENAME);
	}
	MessageBox(NULL, plikWAV, L"Informacja", MB_ICONINFORMATION | MB_OK);
}

nagłówek

extern MUZYKADLL_API int nmuzykadll;

MUZYKADLL_API int fnmuzykadll(void);

extern "C" MUZYKADLL_API void odtwarzajWAV(LPCTSTR plikWAV, bool czyZapetlic);

No i teraz program który korzysta z tej przykładowej funkcji (kompilowany w wxWidgets, MinGW)

 
void wxDLLTest1Dlg::WxButton1Click(wxCommandEvent& event)
{
	// insert your code here
LPCTSTR plikWAV;
plikWAV = "tada.wav";
hDll = LoadLibrary( "muzykadll.dll" );

if( hDll != NULL )
{
    informacja =( MYPROC ) GetProcAddress( hDll, "informacja" );
   
    if( informacja != NULL )
    {
        informacja();
    }
    else
    {
        wxMessageBox( wxT("Błąd wykonywania funkcji w bibliotece DLL. ") );   
    }
   
    odtwarzajWAV =( MYPROC2 ) GetProcAddress( hDll, "odtwarzajWAV" );
   
    if( odtwarzajWAV != NULL )
    {
        odtwarzajWAV(plikWAV, false);
// tutaj dobrze pokazuje nazwe pliku w tym okienku ale funkcja nie odtwarza dzwieku
        MessageBox(0, plikWAV, "Informacja", MB_ICONINFORMATION | MB_OK);

    }
    else
    {
        wxMessageBox( wxT("Błąd wykonywania funkcji w bibliotece DLL. ") );   
    }

}
else
{
 wxMessageBox( wxT("Błąd wczytania biblioteki DLL. ") );   
}

plik nagłówkowy

  
typedef void( * MYPROC2 )(LPCTSTR, bool );
MYPROC2 odtwarzajWAV;
HINSTANCE hDll; 

Cóż, to okienko wywoływane z wxWidgets pokazuje nazwę pliku (jako typ LPCTSTR), a po przekazaniu tego typu danych do funkcji coś się krzaczy (same kwadraciki są jako tekst), tak więc nie odtwarza wskazanej nazwy pliku...
Niby jest zgodność typów danych między parametrem funkcji a przekazywanymi danymi ale coś jest nie tak :/
Wywołanie bezpośrednio funkcji SoundPlay działa bez problemu w samy wxWidgets...

2

Prawdopodobnie jedna część aplikacji jest kompilowana jako ANSI a druga UNICODE.

Nawet mogę strzelać, że DLL-ka w Visualu jest unikodowa, a program w MinGW jest ANSI.

0

A no tak! :) Dzięki! :)
Heh, zapomniałem, o tym... a coś mi tak w podświadomości podpowiadało...
W Visualu przestawiłem we właściwościach projektu Charakter Set na : Not Set i działa.
W Mingw/WxWidgets chyba nie tak prosto by było zmienić z ANSI na Unicode, więc przestawiłem w Visualu z Unicode na ANSI.
Być może nowsze wersje WxDevcpp maja już obsługę Unicodów.

1

W Mingw/WxWidgets chyba nie tak prosto by było zmienić z ANSI na Unicode, w

Robisz po prostu

#define UNICODE
#define _UNICODE

na samym początku (przed inkludami).

0

O dzięki :) Jakoś w poniedziałek sprawdzę...

1 użytkowników online, w tym zalogowanych: 0, gości: 1