【问题标题】:Basic Plugin (NPAPI / npruntime) Hello world基本插件(NPAPI / npruntime)你好世界
【发布时间】:2011-12-16 01:40:12
【问题描述】:

后台步骤

  1. 在这里使用的 Mozilla 代码:http://mxr.mozilla.org/seamonkey/source/modules/plugin/tools/sdk/samples/basic/windows/
  2. 在 Visual Studio 中新建空项目并添加以上文件
  3. 更改的配置类型:动态库 (.dll) 3b。链接器->输入->模块定义文件:BasicPlugin.def
  4. 将 BasicPlugin.cpp 注释为仅具有基本功能并显示 Hello World 的 MessageBox
  5. 编译(成功)并复制到 Firefox 插件目录
  6. 检查:插件(找到)
  7. 加载 HTML 以调用 dll(失败)

我现在正在尝试使用 npruntime 文件并制作一个可编写脚本的插件(不确定如何)。但我不明白为什么插件没有加载。这似乎是所有基本的基本。有人对此有想法吗?

BasicPlugin.cpp

#include "BasicPlugin.h"

NPError NP_Initialize(NPNetscapeFuncs* bFuncs, NPPluginFuncs* pFuncs)
{
MessageBox(NULL,"Hello World","NP_Initialize",MB_OK);

  // Check the size of the provided structure based on the offset of the last member we need.
  pFuncs->newp = NPP_New;
  pFuncs->destroy = NPP_Destroy;
  pFuncs->setwindow = NPP_SetWindow;
  pFuncs->newstream = NPP_NewStream;
  pFuncs->destroystream = NPP_DestroyStream;
  pFuncs->asfile = NPP_StreamAsFile;
  pFuncs->writeready = NPP_WriteReady;
  pFuncs->write = NPP_Write;
  pFuncs->print = NPP_Print;
  pFuncs->event = NPP_HandleEvent;
  pFuncs->urlnotify = NPP_URLNotify;
  pFuncs->getvalue = NPP_GetValue;
  pFuncs->setvalue = NPP_SetValue;

  return NPERR_NO_ERROR;
}

//NP_EXPORT(char*) NP_GetPluginVersion()
//{return PLUGIN_VERSION;}

//NP_EXPORT(const char*) NP_GetMIMEDescription()
//{return "application/basic-plugin:bsc:Basic plugin";}

NPError NP_GetValue(void* future, NPPVariable aVariable, void* aValue) 
{return NPERR_NO_ERROR;}

NPError OSCALL  NP_Shutdown()
{return NPERR_NO_ERROR;}

NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved) 
{
MessageBox(NULL,"Hello World","NPP_New",MB_OK);
return NPERR_NO_ERROR;
}

NPError NPP_Destroy(NPP instance, NPSavedData** save) 
{return NPERR_NO_ERROR;}

NPError NPP_SetWindow(NPP instance, NPWindow* window) 
{
MessageBox(NULL,"Hello World","NPP_SetWindow",MB_OK);
return NPERR_NO_ERROR;
}

NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16_t* stype) 
{return NPERR_GENERIC_ERROR;}

NPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason) 
{return NPERR_GENERIC_ERROR;}

int32_t NPP_WriteReady(NPP instance, NPStream* stream) 
{return 0;}

int32_t NPP_Write(NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer) 
{return 0;}

void NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname) {}

void NPP_Print(NPP instance, NPPrint* platformPrint)  {}
int16_t NPP_HandleEvent(NPP instance, void* event) 
{return 1;}

void NPP_URLNotify(NPP instance, const char* URL, NPReason reason, void* notifyData)  {}

NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value) 
{return NPERR_GENERIC_ERROR;}

NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value) 
{return NPERR_GENERIC_ERROR;}

HTML

<html>
 <body>
  <center><h1>Basic Plugin Example for Mozilla Test Case</h1></center>
  This test case is to demonstrate the Basic Plugin example. You should get a message box saying Hello World.
  <br><br>
  <center><embed type="application/basic-plugin" border=1 width=600 height=40></center>
 </body>
</html>

【问题讨论】:

    标签: plugins npapi npruntime


    【解决方案1】:

    如果您尝试在 Windows 上运行它,那么它将无法运行;你有错误的 Windows 入口点。您列出的那些是 linux 的入口点。请参阅 https://github.com/firebreath/FireBreath/blob/master/src/PluginAuto/Win/np_winmain.cpp 了解 FireBreath 的 windows 入口点文件;也在http://npapi.com/tutorial中解释过

    编辑

    假设还有很多其他的东西;没有看到你的整个项目很难推测。它显示在 about:plugins 中,因此您的字符串资源已经到位。您是否使用 .def 文件正确导出符号? DllMain 是否被调用? (不要在那里使用消息框,只需记录一些内容或设置断点)

    再一次,FireBreath 是(除了作为创建 NPAPI 插件的更简单方法之外)创建功能齐全的 npapi 插件的示例;你可能会从中学到很多东西。如果没有看到你的整个项目,我就无法开始推测。也许作为 github 项目之类的?

    【讨论】:

    • 所以将 NP_GetEntryPoints 的入口点改为:NPError OSCALL NP_GetEntryPoints(NPPluginFuncs* pFuncs) 和 NP_Initialize: NPError FAR PASCAL NP_Initialize(NPNetscapeFuncs* pFuncs) 没有解决它除了入口点还有别的吗?
    • 我无法设置断点,VS 说没有加载任何符号。
    • 嗯,解决方案是在 VS 中我没有将 def 文件添加到链接器。感谢您的帮助!
    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多