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 
#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);
这样插件运行的时候就会在新创建的线程中播放声音文件了。


你可能感兴趣的:(mozilla,插件,教程)