2

バックグラウンドステップ

  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にコメントし、基本的な機能のみを持ち、HelloWorldの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>
4

1 に答える 1

3

これをWindowsで実行しようとすると、機能しません。Windowsのエントリポイントが間違っています。あなたがリストしたものはLinuxのエントリーポイントです。FireBreathのWindowsエントリポイントファイルについては、 https://github.com/firebreath/FireBreath/blob/master/src/PluginAuto/Win/np_winmain.cppを参照してください。http://npapi.com/tutorialでも説明されています

編集

仮に、他にもたくさんのことがあるかもしれません。プロジェクト全体を見ずに推測するのは難しいです。それはabout:pluginsに表示されるので、文字列リソースは適切に配置されています。.defファイルを使用してシンボルを正しくエクスポートしていますか?DllMainは呼び出されますか?(そこでメッセージボックスを使用しないでください。何かをログに記録するか、ブレークポイントを設定してください)

繰り返しになりますが、FireBreathは(NPAPIプラグインを作成するためのはるかに簡単な方法であることに加えて)完全に機能するnpapiプラグインを作成する例です。あなたはそれを見ることから多くを学ぶかもしれません。それがうまくいかない場合、私はあなたのプロジェクト全体を見ずに推測を始めることができませんでした。多分githubプロジェクトか何かとして?

于 2011-12-14T16:54:54.117 に答える