NPAPI插件開發詳細記錄:實用功能(庫的使用及多線程)

有了前面的hello world的經驗,本文在其基礎上研究一些實用功能的實現。

庫的動態加載

Windows平臺下,可以動態的對dll進行加載,使用到的API主要有:LoadLibrary、GetProcAddress、FreeLibrary等。下面以加載winmm.dll爲例對相關代碼進行簡要介紹:
動態加載dll,在加載之前先進行typedef,這裏以實用winmm.dll中的函數PlaySound爲例:

typedef BOOL (__stdcall/*或者WINAPI*/* pPlaySound)(LPCSTR pszSound,HMODULE hmod,DWORD fdwSound );
接着加載dll並獲取PlaySound的入口:
HMODULE handle = LoadLibrary("winmm.dll");
if(!handle)
{
//加載動態庫不成功
return;
}
else
{
pPlaySound PlaySound=NULL;
PlaySound=(pPlaySound)::GetProcAddress(handle, "PlaySound");
接下來就可以使用剛剛獲取到的函數了:
if(!PlaySound)
{//加載函數不成功
return;
}
else
{//加載成功,執行
HMODULE hmod=NULL;
DWORD fdwSound=SND_FILENAME|SND_ASYNC;//SND_LOOP|
PlaySound(_T("C:\\audio.wav"), hmod, fdwSound);
}
}
使用完畢,進行釋放:
if (handle)
{
FreeLibrary(handle);
}
動態加載dll比較方便,但我用得比較多的是靜態加載。

庫的靜態加載

還是以加載winmm庫爲例,靜態加載就不是winmm.dll了而是winmm.lib,使用方法是首先包含頭文件,然後使用#pragma來加載lib文件:
代碼如下:

#include <MMSystem.h>
#pragma comment(lib,"winmm.lib")
接着在需要使用winmm.lib中的函數的地方只需要像調用其他函數一樣進行調用即可,如:
HMODULE hmod=NULL;
DWORD fdwSound=SND_FILENAME|SND_ASYNC;//SND_LOOP|
PlaySound(_T("C:\\audio.wav"), hmod, fdwSound);
注意:前面的代碼我都是在plugin::init中添加的,能夠在測試頁面打開後正確播放C盤的audio.wav文件。

創建新線程

該功能可以使用_beginthread(需包含頭文件process.h)來創建新的線程也可也使用WIN API CreateThread(需包含頭文件windows.h)來創建。
測試這個功能可以創建一個新的線程,並在該線程中利用前面的代碼播放聲音文件:
首先實現函數beginPlay,利用靜態加載lib的方式來實現:

void beginPlay(void*)
{
HMODULE hmod=NULL;
DWORD fdwSound=SND_FILENAME|SND_ASYNC;//SND_LOOP|
PlaySound(_T("C:\\audio.wav"), hmod, fdwSound);
}
在init中添加_beginthread(beginPlay,0,NULL);
這樣插件運行的時候就會在新創建的線程中播放聲音文件了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章