﻿{"id":56,"date":"2010-05-21T09:38:49","date_gmt":"2010-05-21T01:38:49","guid":{"rendered":"http:\/\/nick.workao.org\/?p=56"},"modified":"2010-05-21T09:46:03","modified_gmt":"2010-05-21T01:46:03","slug":"mozilla-firefox-%e6%8f%92%e4%bb%b6%e5%bc%80%e5%8f%91-%e5%bf%ab%e9%80%9f%e5%85%a5%e9%97%a8","status":"publish","type":"post","link":"http:\/\/nick.txtcc.com\/index.php\/other\/56","title":{"rendered":"mozilla firefox \u63d2\u4ef6\u5f00\u53d1 \u5feb\u901f\u5165\u95e8"},"content":{"rendered":"<p><span style=\"color: #404040;\"><span style=\"color: #0000ff; font-size: x-large;\">\u5982\u679c<\/span>\u60f3\u8b93\u4f60\u7684 binary \u8edf\u4f53\u5143\u4ef6\u5728\u700f\u89bd\u5668\u4e0a\u80fd\u5920\u57f7\u884c, \u4f60\u9700\u8981\u5be6\u505a\u4e00\u4e9b\u898f\u5b9a\u7684\u4ecb\u9762. \u9019\u6a23\u7684\u7a0b\u5f0f\u5c31\u80fd\u50cf Flash \u4e00\u6a23, \u5d4c\u5165\u5728\u7db2\u9801\u4e2d, \u8b93\u4f7f\u7528\u8005\u4f7f\u7528. \u7136\u800c<\/span>\n<span style=\"color: #404040;\">\u4e0d\u540c\u7684\u700f\u89bd\u5668\u8981\u5be6\u505a\u7684\u4ecb\u9762\u662f\u4e0d\u4e00\u6a23\u7684.<\/span><\/p>\n<p><span style=\"color: #404040;\">\u82e5\u4f60\u5e0c\u671b\u5728 IE \u4e0a\u8981\u80fd\u57f7\u884c, \u5247\u4f60\u7684\u5143\u4ef6\u5fc5\u9808\u5be6\u505a <span style=\"color: #ff0000;\">ActiveX<\/span> \u7684\u4ecb\u9762<\/span><\/p>\n<p><span style=\"color: #404040;\">\u82e5\u4f60\u5e0c\u671b\u5728 Firefox \u6216 Opera \u751a\u81f3\u662f Google \u7684 <span style=\"color: #ff0000;\">Chrome<\/span> \u700f\u89bd\u5668\u4e0a\u4e5f\u80fd\u57f7\u884c\u4f60\u7684\u7a0b\u5f0f,\u00a0 \u90a3\u9ebc\u4f60\u7684\u5143\u4ef6\u5fc5\u9808\u5be6\u505a NPAPI \u4ecb\u9762.<\/span><\/p>\n<p><span style=\"color: #008000; font-size: x-large;\">\u9019\u4e00\u5207<\/span>\u90fd\u8981\u602a\u5fae\u8edf\u662f\u5c6c\u65bc\u5c01\u9589\u67b6\u69cb, \u9019\u4f7f\u5f97\u4e00\u4e9b\u8de8\u5e73\u53f0\u7684\u8edf\u4f53\u958b\u767c\u7d44\u7e54, \u4e0d\u9858\u610f\u5be6\u505a ActiveX. \u6240\u4ee5\u5982\u679c\u4f60<span style=\"color: #0000ff;\">\u8981\u8b93 firefox \u6216\u65b0\u7684 Goolge \u700f\u89bd\u5668 Chrome \u4e0a\u9762\u5beb plugin, \u4f60\u80fd\u7528\u7684\u6280\u8853\u662f NPAPI<\/span>.<\/p>\n<p>\u9019\u4efd\u6587\u4ef6\u5167\u5bb9\u5305\u542b<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1. \u5982\u4f55\u9078\u64c7\u6b63\u78ba\u7684\u65b9\u5f0f, \u64b0\u5beb scriptable plugins<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2. \u5982\u4f55\u4e0b\u8f09\u6b63\u78ba\u7684 NPAPI \u7bc4\u4f8b<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 3. \u5982\u4f55\u5728 Visual Studio .Net IDE \u4e0b, \u7de8\u8b6f\u7bc4\u4f8b<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4. \u5982\u4f55\u6e2c\u8a66\u4f60\u7684 plugin<\/p>\n<hr \/>\n<p><strong>\u9078\u64c7\u6b63\u78ba\u7684\u65b9\u5f0f, \u64b0\u5beb scriptable plugins<\/strong><\/p>\n<p>\u6211\u60f3\u4f60\u61c9\u8a72\u77e5\u9053 Plugins \u8207 Extensions\u00a0 \u662f\u4e0d\u4e00\u6a23\u7684, \u4f60\u60f3\u77e5\u9053 Firefox Plugin \u7684\u6700\u65b0\u767c\u5c55, \u61c9\u8a72\u5230<\/p>\n<blockquote><a title=\"http:\/\/developer.mozilla.org\/en\/Plugins\" href=\"http:\/\/developer.mozilla.org\/en\/Plugins\">http:\/\/developer.mozilla.org\/en\/Plugins<\/a><\/blockquote>\n<p>\u4f60\u53ef\u4ee5\u7528 plugin \u591a\u5a92\u9ad4\u61c9\u7528\u7a0b\u5f0f, \u4f8b\u5982\u76e3\u63a7\u7cfb\u7d71, \u4eba\u7269\u81ea\u52d5\u8ffd\u8e64 \u7b49\u61c9\u7528,\u00a0 \u5168\u90e8\u90fd\u53ef\u4ee5\u5229\u7528 NPAPI \u9019\u500b\u4ecb\u9762\u8b93\u4f60\u7684\u61c9\u7528\u7a0b\u5f0f\u7db2\u9801\u5316.<\/p>\n<p>\u5b98\u65b9\u7db2\u9801\u88e1\u9762\u8a73\u7d30\u7684\u544a\u8a34\u4f60,\u00a0 <span style=\"color: #0000ff;\">NPAPI plugins \u53ef\u4ee5\u5229\u7528 java script \u9032\u884c\u64cd\u63a7, \u800c\u820a\u7684\u6280\u8853 <\/span>\n<a href=\"http:\/\/developer.mozilla.org\/en\/XPCOM\"><span style=\"color: #0000ff;\">XPCOM<\/span><\/a>\n<span style=\"color: #0000ff;\"> \u548c <\/span>\n<a href=\"http:\/\/developer.mozilla.org\/en\/LiveConnect\"><span style=\"color: #0000ff;\">LiveConnect<\/span><\/a>\n<span style=\"color: #0000ff;\"> \u5df2\u7d93\u4e0d\u9069\u5408\u7528\u4f86\u958b\u767c NPAPI plugins <\/span>\u4e86.<\/p>\n<p>\u8981\u8b93 plugins \u80fd\u88ab script \u64cd\u63a7, \u4f60\u61c9\u8a72\u4f7f\u7528 <span style=\"color: #ff0000;\">npruntime<\/span><\/p>\n<blockquote><a href=\"http:\/\/developer.mozilla.org\/en\/LiveConnect\">\u7db2\u5740:<\/a> <a title=\"http:\/\/developer.mozilla.org\/en\/Gecko_Plugin_API_Reference\/Scripting_plugins\" href=\"http:\/\/developer.mozilla.org\/en\/Gecko_Plugin_API_Reference\/Scripting_plugins\">http:\/\/developer.mozilla.org\/en\/Gecko_Plugin_API_Reference\/Scripting_plugins<\/a><\/blockquote>\n<p>\u00a0<\/p>\n<p><strong>\u6709\u5716\u6709\u771f\u76f8<\/strong><\/p>\n<p>\u5beb\u7a0b\u5f0f\u4e5f\u662f\u4e00\u6a23, <span style=\"color: #ff0000;\">\u8207\u5176\u770b\u4e00\u5806\u6587\u4ef6, \u5148\u7d66\u6211\u4e00\u500b\u80fd\u57f7\u884c\u7684\u7bc4\u4f8b. <\/span>\u518d\u8ac7\u5f8c\u9762\u7684\u512a\u79c0\u67b6\u69cb\u8207API \u6587\u4ef6.<\/p>\n<p>\u6240\u4ee5\u5462 &#8230;<\/p>\n<p><span style=\"color: #ff0000;\">\u6709\u7a0b\u5f0f\u9084\u8981\u80fd work \u624d\u6709\u771f\u76f8! <\/span>\u4f60\u770b\u770b, \u83dc\u4e0d\u5c31\u7aef\u4e0a\u4f86\u4e86\u55ce &#8230;.<\/p>\n<p>\u6211\u77e5\u9053\u4f60\u5728\u60f3\u4ec0\u9ebc, \u4e0b\u9762\u7684\u7bc4\u4f8b\u652f\u63f4 Firefox 3.0.<\/p>\n<p><strong>\u5982\u4f55\u5beb\u7a0b\u5f0f?<\/strong><\/p>\n<p>Step 1: \u4e0b\u8f09 Gecko_SDK: xurlrunner<\/p>\n<blockquote>\u7db2\u5740: <a title=\"http:\/\/developer.mozilla.org\/en\/Gecko_SDK\" href=\"http:\/\/developer.mozilla.org\/en\/Gecko_SDK\">http:\/\/developer.mozilla.org\/en\/Gecko_SDK<\/a>\n* \u6211\u4e0b\u8f09\u7684\u662f Gecko 1.9 (Firefox 3.0) \u7248\u672c<\/blockquote>\n<p>Step 2: \u4e0b\u8f09\u7bc4\u4f8b\u7a0b\u5f0f<\/p>\n<blockquote>\u7db2\u5740:\u00a0 <a title=\"http:\/\/mxr.mozilla.org\/seamonkey\/source\/modules\/plugin\/samples\/\" href=\"http:\/\/mxr.mozilla.org\/seamonkey\/source\/modules\/plugin\/samples\/\">http:\/\/mxr.mozilla.org\/seamonkey\/source\/modules\/plugin\/samples\/<\/a>\n\n\u9ede\u9078 <span style=\"color: #0000ff;\">npruntime<\/span> \u7bc4\u4f8b\n\n\u6bcf\u500b\u6a94\u6848\u90fd\u6709 Raw file \u53ef\u4ee5\u8b93\u4f60\u4e0b\u8f09, \u628a\u6240\u6709\u7684\u6a94\u6848\u4e0b\u8f09\u56de\u53bb\u5427!\n\n<a href=\"http:\/\/lh5.ggpht.com\/mqJing\/SMCvlkrmgjI\/AAAAAAAAAgQ\/ufPl14KcIhM\/s1600-h\/snap003%5B2%5D.jpg\"><img decoding=\"async\" src=\"http:\/\/nick.txtcc.com\/wp-content\/uploads\/remote_image\/2010\/05\/013946AT2.jpg\" border=\"0\" alt=\"snap003\"><\/a>\n\n<span style=\"color: #ff0000;\">\u6ce8\u610f:<\/span> <a href=\"http:\/\/developer.mozilla.org\/en\/Plugins\/Samples_and_Test_Cases\">\u4f60\u6703\u5728 Samples and Test Cases<\/a> \u767c\u73fe, \u7bc4\u4f8b\u7a0b\u5f0f\u6709\u5169\u500b\u8f09\u9ede, \u5176\u4e2d\u7b2c\u4e8c\u500b<a href=\"http:\/\/lxr.mozilla.org\/seamonkey\/source\/modules\/plugin\/tools\/sdk\/samples\/\">mozilla\/modules\/plugin\/tools\/sdk\/samples<\/a> \u88e1\u9762, scriptable \u4f7f\u7528\u7684\u662f\u820a\u7684\u6280\u8853 XPCOM, \u8acb\u4e0d\u8981\u4f7f\u7528.\u00a0 \u5426\u5247\u4f60\u7de8\u51fa\u4f86\u7684 dll \u5728 Firefox 3.0 \u6703\u7121\u6cd5\u57f7\u884c.<\/blockquote>\n<p>Step 3: \u5efa\u7acb\u4e00\u500b\u7c21\u55ae Visual Studio \u5c08\u6848, \u628a\u525b\u525b\u6293\u5230\u7684\u7a0b\u5f0f\u653e\u9032\u53bb.<\/p>\n<blockquote>mozilla \u5b98\u65b9\u7db2\u9801\u6709\u6559\u5b78: \u4f60\u53ef\u4ee5\u53bb\u770b\u4e00\u4e0b (<a href=\"http:\/\/developer.mozilla.org\/en\/Compiling_The_npruntime_Sample_Plugin_in_Visual_Studio\">link<\/a>)\n\n\u4e0b\u9762\u662f\u6211\u5beb\u7684\u7c21\u55ae<span style=\"color: #0000ff;\">\u4fee\u6b63<\/span>\u4e2d\u6587\u7248 (\u5225\u64d4\u5fc3, \u9019\u4e9b\u6d41\u7a0b\u90fd\u5f88\u7c21\u55ae)\n\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-\n\n<strong>1. \u5efa\u7acb\u65b0\u7684\u5c08\u6848: project \u540d\u7a31\u8a2d\u5b9a\u70ba <span style=\"color: #ff0000;\">nprt<\/span>\n<\/strong>\n<span style=\"color: #008000;\">VC \u7684\u64cd\u4f5c:<\/span>\u00a0 <span style=\"color: #008000;\">New Project -> Vistual C++ -> Win32 Project<\/span>\u00a0\n\u00a0\u00a0\n\n<strong>2. Application Settings \u9078 DLL \u4e26\u4e14\u8a2d\u5b9a\u70ba Empty project <\/strong>\n\n<strong>3. \u628a\u7bc4\u4f8b\u7a0b\u5f0f\u52a0\u5165\u5c08\u6848\u4e2d\n<\/strong>\u00a0 (a) \u628a\u5f9e <a href=\"http:\/\/mxr.mozilla.org\/seamonkey\/source\/modules\/plugin\/samples\/\">http:\/\/mxr.mozilla.org\/seamonkey\/source\/modules\/plugin\/samples\/<\/a>\n\u00a0\u00a0\u00a0\u00a0\u00a0 \u4e0b\u8f09\u56de\u4f86\u7684\u6240\u6709\u6a94\u6848 copy \u5230 nprt\/nprt \u76ee\u9304\u4e2d\n\u00a0 (b) \u52a0\u5165 nprt \u5c08\u6848\u4e2d\n\n<strong>4. \u89e3\u958b xulrunner-sdk:<\/strong>\u00a0 \u653e\u5728<span style=\"color: #ff0000;\"> <strong>C:xulrunner-sdk<\/strong><\/span>\n\u7db2\u5740:\n\n<a href=\"http:\/\/developer.mozilla.org\/en\/docs\/Gecko_SDK\">http:\/\/developer.mozilla.org\/en\/docs\/Gecko_SDK<\/a>\n\u00a0\u00a0\n\n<strong>5. \u8a2d\u5b9a Include Path<\/strong>\n\n<span style=\"color: #008000;\">\u00a0\u00a0\u00a0\u00a0 VC \u7684\u64cd\u4f5c: C\/C++ -> Additional Include Directories<\/span>\n\u00a0\u00a0\u00a0 &#8220;C:xulrunner-sdkinclude&#8221;;&#8221;C:xulrunner-sdkincludeplugin&#8221;;&#8221;C:xulrunner-sdkincludenspr&#8221;;&#8221;C:xulrunner-sdkincludejava&#8221;\n\n<strong>6. \u76f4\u63a5\u8a2d\u5b9a\u4e0b\u9762\u7684\u5b9a\u7fa9\n<\/strong>\u00a0\u00a0\u00a0\u00a0 <span style=\"color: #008000;\">VC \u7684\u64cd\u4f5c: C\/C++ -> Preprocessor -> Preprocessor Definitions<\/span>\n\u00a0\u00a0 WIN32;_WINDOWS;XP_WIN32;MOZILLA_STRICT_API;XPCOM_GLUE;XP_WIN;_X86_;NPSIMPLE_EXPORTS\n\u00a0\u00a0 _DEBUG\n\u00a0\u00a0\u00a0\n\n<strong>7. \u95dc\u6389 precompiled \u9078\u9805<\/strong> (\u5982\u679c\u4f60\u525b\u525b\u9078\u7684\u662f Empty Project, \u5247 precompiled \u9078\u9805\u61c9\u8a72\u5df2\u7d93\u95dc\u9589)\n\u00a0 <span style=\"color: #008000;\">VC \u7684\u64cd\u4f5c: C\/C++ -> Precompiled Headers -> Create\/Use Precompiled Header: \u8a2d\u5b9a\u70ba Not Using Precompiled Headers<\/span>\n\n<strong>8. \u8a2d\u5b9a Module Definition File<\/strong>: nprt.def\n\u00a0 <span style=\"color: #008000;\">VC \u7684\u64cd\u4f5c: Linker -> Input -> Module Definition File: <\/span>\n\n<strong>9. \u628a plugin.cpp \u7684 DrawText \u6539\u6210 DrawTextA<\/strong>\n\n<strong>10. \u4fee\u6539\u00a0 plugin.cpp \u88e1\u9762\u7684 Invoke method \u6539\u6210\u4e0b\u9762\u9019\u6a23<\/strong>,\n\n\u5426\u5247\u7576 firefox \u547c\u53eb\u4f60\u7684 plugin \u6642, \u6703 \u7576\u6389.\n\n<span style=\"color: #008000;\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/span>\n\n<span style=\"color: #008000;\">bool ScriptablePluginObject::Invoke(NPIdentifier name, const NPVariant *args,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint32_t argCount, NPVariant *result) {\n\u00a0 if (name == sFoo_id) {\n\u00a0\u00a0\u00a0 printf (&#8220;foo called!n&#8221;);\n\u00a0\u00a0\u00a0 MessageBox(NULL,L&#8221;foo \u88ab\u547c\u53eb &#8220;,L&#8221;Java Script \u547c\u53eb\u7bc4\u4f8b&#8221;,MB_OK);\n\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0 return PR_TRUE;\n\u00a0 } <\/span>\n\n<span style=\"color: #008000;\">\u00a0 return PR_FALSE;\n}<\/span>\n\n<span style=\"color: #008000;\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/span>\n\n<strong>11. \u4fee\u6539 npp_gate.cpp , \u628a _GetJavaClass\u00a0 \u62ff\u6389<\/strong>\n\n<span style=\"color: #008000;\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/span>\n\n<span style=\"color: #008000;\">\/*\u00a0 \u52a0\u5165\u8a3b\u89e3 (\u611f\u8b1d\u7db2\u53cb <\/span>\n<a href=\"http:\/\/chuiwenchiu.spaces.live.com\/\"><span style=\"color: #008000;\">Chui-Wen Chiu<\/span><\/a>\n<span style=\"color: #008000;\"> \u63d0\u9192)<\/span>\n\n<span style=\"color: #008000;\">jref NPP_GetJavaClass (void)\n{\nreturn NULL;\n}<\/span>\n\n<span style=\"color: #008000;\">*\/<\/span>\n\n<span style=\"color: #008000;\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/span>\n\n\u7de8\u8b6f\u61c9\u8a72\u6703\u901a\u904e, \u7522\u751f <span style=\"color: #ff0000;\">nprt.dll<\/span>\n\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<\/blockquote>\n<p><strong>\u6e2c\u8a66:<\/strong><\/p>\n<p>\u00a0\u00a0\u00a0\u00a0 Step 1: \u628a nprt.dll \u653e\u5230 firefox \u7684 plugins \u76ee\u9304\u5e95\u4e0b<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0 Step 2: \u958b\u555f firefox \u5728\u7db2\u5740\u8f38\u5165<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 about:plugins<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u770b\u770b\u4f60\u7684 plugins \u662f\u5426\u5728\u88e1\u9762.<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u9577\u76f8\u61c9\u8a72\u662f\u9019\u6a23.<\/p>\n<p><a href=\"http:\/\/lh3.ggpht.com\/mqJing\/SMCvm4hTMCI\/AAAAAAAAAgY\/jsUITWMERhg\/s1600-h\/snap003%5B6%5D.jpg\"><img decoding=\"async\" src=\"http:\/\/nick.txtcc.com\/wp-content\/uploads\/remote_image\/2010\/05\/013949Jlh.jpg\" border=\"0\" alt=\"snap003\" \/><\/a><\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0 Step 3: \u57f7\u884c \u6e2c\u8a66 test.html<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u6ce8\u610f 1: \u4f60\u4e0b\u8f09\u7684 test.html \u5df2\u7d93\u56b4\u91cd\u904e\u671f\u4e86. \u6240\u4ee5\u6211\u7684\u4f5c\u6cd5\u662f\u81ea\u5df1\u5beb\u4e00\u500b<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <a href=\"http:\/\/mqjing.twbbs.org.tw\/~ching\/test2_html.txt\">test2.html<\/a><\/p>\n<p>\u6587\u7ae0\u7684\u4f8b\u5b50\u9488\u5bf9\u7684\u662fFirefox 3.0(\u8c8c\u4f3c\u7528\u7684XULRunner 1.9.0)\uff0c\u6211\u7535\u8111\u4e0a\u88c5\u7684Firefox\u7248\u672c\u4e3a3.5.5\uff0c\u5f00\u53d1\u7528\u7684XULRunner\u7248\u672c\u4e3a1.9.1.4\uff0c\u53d1\u73b0\u4ee3\u7801\u6709\u4e00\u4e9b\u95ee\u9898\uff0c\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n<div>1\u3001npupp.h\u88abnpfunctions.h\u53d6\u4ee3\u4e86\uff0c\u6240\u4ee5\u8981\u5c06npupp.h\u66ff\u6362\u6210npfunctions.h\u3002<\/div>\n<div>2\u3001 \u7f16\u8bd1\u662f\u4f1a\u63d0\u793aint16\uff0cint32\u672a\u88ab\u5b9a\u4e49\u3002\u9996\u5148\u5305\u542bnptypes.h\u5934\u6587\u4ef6\uff0c\u6253\u5f00\u8be5\u5934\u6587\u4ef6\uff0c\u53d1\u73b0\u5176\u4e2d\u4f7f\u7528\u4e86typedef\u91cd\u5b9a\u4e49\u51e0\u4e2a\u7b80\u5355\u7c7b\u578b\uff0c\u6bd4\u5982 int16_t\uff0cint32_t\u7b49\u3002\u5c06\u6e90\u4ee3\u7801\u4e2d\u6240\u6709\u7684int16\uff0cint32\u90fd\u66ff\u6362\u6210int16_t\uff0cint32_t\u3002<\/div>\n<div>3\u3001NP_TRUE\/NP_FALSE\u672a\u88ab\u5b9a\u4e49\uff0c\u76f4\u63a5\u5c06\u5176\u66ff\u6362\u6210true\/false\u4fbf\u53ef\u3002<\/div>\n<div>\u00a0\u00a0 \u00a0 \u00a0 \u4fee\u6539\u6e90\u4ee3\u7801\u65f6\u4e0d\u8981\u51fa\u73b0\u4e2d\u6587\uff0c\u5426\u5219\u7f16\u8bd1\u5668\u4f1a\u6b7b\u6389\u3002\u505a\u5230\u8fd9\u51e0\u70b9\u4e4b\u540e\u7f16\u8bd1\u5de5\u7a0b\u5c31\u53ef\u4ee5\u6b63\u5e38\u751f\u4ea7DLL\u6587\u4ef6\uff0c\u5c06nprt.dll\u62f7\u8d1d\u5230Firefox\u5b89\u88c5\u76ee\u5f55\u7684plugins\u5b50\u76ee\u5f55\u4e0b\uff0c\u5728Firefox\u7684\u5730\u5740\u680f\u8f93\u5165&#8221;about:plugins&#8221;\u5c31\u53ef\u4ee5\u770b\u5230\u63d2\u4ef6\u4e86\u3002<\/div>\n<div>\u00a0\u00a0 \u00a0 \u00a0 \u6587\u7ae0\u4e2d\u63d0\u5230Mozilla\u5b98\u65b9\u63d0\u4f9b\u7684\u6d4b\u8bd5\u9875\u9762\u4e25\u91cd\u8fc7\u671f\uff0c\u6211\u6d4b\u8bd5\u4e86\u4e0b\u8fd8\u57fa\u672c\u6b63\u5e38\u5427\uff0c\u53ea\u4e0d\u8fc7\u6211\u4e0b\u4e0d\u5230\u4f5c\u8005\u63d0\u4f9b\u7684\u6d4b\u8bd5\u9875\u9762\uff0c\u4e5f\u4e0d\u77e5\u9053\u4f5c\u8005\u6539\u6210\u4ec0\u4e48\u6837\u5b50\u4e86\u3002\u6d4b\u8bd5\u9875 \u9762\u7684\u4ee3\u7801\u504f\u591a\uff0c\u5b83\u4f7f\u7528embed\u6765\u5d4c\u5165\u76f8\u5e94\u7c7b\u578b\u7684\u4e1c\u4e1c\u6765\u8c03\u7528\u63d2\u4ef6\uff0c\u4e0d\u77e5\u9053\u4e3a\u4ec0\u4e48Firefox\u4f9d\u65e7\u663e\u793a\u7f3a\u5931\u63d2\u4ef6\uff0c\u63d2\u4ef6\u4e2d\u751f\u6210\u7684\u7a97\u53e3\u5e76\u6ca1\u6709\u6b63\u786e\u5730\u663e\u793a\u51fa\u6765\uff0c \u4e0d\u8fc7\u522b\u7684\u90e8\u5206\u90fd\u662f\u6b63\u5e38\u7684\uff0c\u53ef\u4ee5\u8c03\u7528foo\u51fd\u6570\uff0c\u67e5\u770bbar\u5c5e\u6027\u3002<\/div>\n<div>\u00a0\u00a0 \u00a0 \u00a0 \u8fd9\u4e2anprt.dll\u4f7f\u7528nprt.def\u53ea\u5411\u5916\u66b4\u9732\u4e09\u4e2a\u63a5\u53e3\uff0c\u5206\u522b\u662fNP_GetEntryPoints\u3001NP_Initialize\u548c NP_Shutdown\uff0c\u8fd9\u5e94\u8be5\u662f\u6240\u6709NPAPI\u63d2\u4ef6\u7684\u89c4\u8303\u5427\uff0c\u6211\u662f\u7528dumpbin\u770b\u4e86\u770b\u6dd8\u5b9d\u7684Chrome NPAPI\u63d2\u4ef6\u4e2dnpwangwang.dll\u5bfc\u51fa\u7684\u63a5\u53e3\uff0c\u53d1\u73b0\u4e5f\u53ea\u6709\u8fd9\u4e09\u4e2a\u3002dll\u4e2d\u5b9e\u73b0\u4e86\u8bb8\u591aNPP\u51fd\u6570\uff0c\u5927\u91cf\u7684NPN\u51fd\u6570\u90fd\u662f\u76f4\u63a5\u8c03\u7528NPP\u51fd\u6570\u3002 \u6211\u5728\u4ee3\u7801\u4e2d\u52a0\u5165\u4e86\u8bb8\u591aMessageBox\u8bed\u53e5\u4ee5\u8ddf\u8e2a\u7a0b\u5e8f\u7684\u8fd0\u884c\uff0c\u53d1\u73b0\u6709\u70b9\u5934\u6655\u3002\u9996\u5148NPP_NEW\u51fd\u6570\u4f1a\u88ab\u8c03\u7528\uff0c\u7136\u540e\u5b83\u4f1a\u751f\u6210\u4e00\u4e2aCPlugin\u5bf9\u8c61\uff0c \u800cCPlugin\u6784\u9020\u51fd\u6570\u4e2d\u53c8\u4f1a\u751f\u6210ScriptablePluginObject\u5bf9\u8c61\uff0c\u5f53\u5173\u95ed\u6d4b\u8bd5\u9875\u9762\u65f6\uff0c\u76f8\u5e94\u7684\u5bf9\u8c61\u4f1a\u88ab\u6790\u6784\uff0c\u4e0d\u8fc7\u6709\u65f6\u5019\u6709\u70b9\u4e71\u3002\u5728\u811a \u672c\u4e2d\u8c03\u7528foo\u51fd\u6570\uff0c\u4f1a\u89e6\u53d1ScriptablePluginObject::invoke\u51fd\u6570\u8fd0\u884c\uff0cinvoke\u51fd\u6570\u5185\u90e8\u6839\u636e\u540d\u5b57\u5b9e\u73b0foo\u5bf9\u5e94\u7684\u64cd \u4f5c\u3002<\/div>\n<div>\n<div>bool<\/div>\n<div>ScriptablePluginObject::HasMethod(NPIdentifier name)<\/div>\n<div>{<\/div>\n<div>\u00a0\u00a0return name == sFoo_id;<\/div>\n<div>}<\/div>\n<div>\u00a0<\/div>\n<div>\n<div>bool<\/div>\n<div>ScriptablePluginObject::HasProperty(NPIdentifier name)<\/div>\n<div>{<\/div>\n<div>\u00a0\u00a0return (name == sBar_id ||<\/div>\n<div>\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0name == sPluginType_id);<\/div>\n<div>}<\/div>\n<div>\u00a0\u00a0 \u00a0 \u00a0 \u8fd9\u4e24\u4e2a\u51fd\u6570\u8fd4\u56de\u5bf9\u5e94\u7684\u62e5\u6709\u7684\u65b9\u6cd5\u548c\u5c5e\u6027\u3002\u6bcf\u6b21\u8c03\u7528\u65b9\u6cd5\u8bbf\u95ee\u5c5e\u6027\u65f6\u90fd\u4f1a\u8c03\u7528\u8fd9\u4e24\u4e2a\u65b9\u6cd5\u5224\u65ad\u76f8\u5e94\u7684\u65b9\u6cd5\u548c\u5c5e\u6027\u662f\u5426\u5b58\u5728\u3002\u4e0b\u9762\u7ed9\u51fa\u4e00\u4e2a\u6700\u7b80\u5355\u7684\u6d4b\u8bd5\u9875\u9762\uff0c\u70b9\u4e00\u4e2a\u6309\u94ae\u53ef\u4ee5\u8c03\u7528foo\u65b9\u6cd5\uff0c\u70b9\u7b2c\u4e8c\u4e2a\u6309\u94ae\u53ef\u4ee5\u83b7\u53d6bar\u5c5e\u6027\u3002<\/div>\n<div>\n<div><HTML><\/div>\n<div><HEAD><\/div>\n<div><TITLE>Scriptable Plug-in Test<\/TITLE><\/div>\n<div><\/HEAD><\/div>\n<div><BODY id=\"bodyId\"><\/div>\n<div>\u00a0<\/div>\n<div><object id=\"pluginobj\" type=\"application\/mozilla-npruntime-scriptable-plugin\"><\/object><\/div>\n<div>\u00a0<\/div>\n<div><br><\/div>\n<div><form name=\"formname\"><\/div>\n<div><input type=button value=\"Call pluginobj.foo()\" onclick='alert(pluginobj.foo())'><\/div>\n<div><input type=button value=\"Get pluginobj.bar\" onclick='alert(pluginobj.bar)'><\/div>\n<div><\/form><\/div>\n<div>\u00a0<\/div>\n<div><\/BODY><\/div>\n<div><\/HTML><\/div>\n<\/div>\n<div>\u00a0\u00a0 \u00a0 \u00a0 \u5475\u5475\uff0c\u73b0\u5728\u77e5\u9053\u600e\u4e48\u505aNPAPI\u63d2\u4ef6\u4e86\uff0c\u53ef\u4ee5\u4e3aChrome\u5199\u4e00\u4e2a\u63d2\u4ef6\uff0c\u5728\u53f3\u4e0a\u89d2\u7684\u6269\u5c55\u56fe\u6807\u680f\u4ee5\u4e00\u4e2a\u56fe\u6807\u7684\u65b9\u5f0f\u663e\u793a\u7535\u6c60\u5269\u4f59\u4f7f\u7528\u65f6\u95f4\uff0c\u6709\u7a7a\u7684\u65f6\u5019\u5c31\u5c1d\u8bd5\u4e0b\u5427 ^_^<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>\u5982\u679c\u60f3\u8b93\u4f60\u7684 binary \u8edf\u4f53\u5143\u4ef6\u5728\u700f\u89bd\u5668\u4e0a\u80fd\u5920\u57f7\u884c, \u4f60\u9700\u8981\u5be6\u505a\u4e00\u4e9b\u898f\u5b9a\u7684\u4ecb\u9762. \u9019\u6a23\u7684\u7a0b\u5f0f\u5c31\u80fd\u50cf Flash \u4e00\u6a23, \u5d4c\u5165\u5728\u7db2\u9801\u4e2d, \u8b93\u4f7f\u7528\u8005\u4f7f\u7528. \u7136\u800c \u4e0d\u540c\u7684\u700f\u89bd\u5668\u8981\u5be6\u505a\u7684\u4ecb\u9762\u662f\u4e0d\u4e00\u6a23\u7684. &#46;&#46;&#46;<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16],"tags":[33,32,35,34],"class_list":["post-56","post","type-post","status-publish","format-standard","hentry","category-other","tag-firefox","tag-mozilla","tag-35","tag-34"],"_links":{"self":[{"href":"http:\/\/nick.txtcc.com\/index.php\/wp-json\/wp\/v2\/posts\/56","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/nick.txtcc.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/nick.txtcc.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/nick.txtcc.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/nick.txtcc.com\/index.php\/wp-json\/wp\/v2\/comments?post=56"}],"version-history":[{"count":3,"href":"http:\/\/nick.txtcc.com\/index.php\/wp-json\/wp\/v2\/posts\/56\/revisions"}],"predecessor-version":[{"id":65,"href":"http:\/\/nick.txtcc.com\/index.php\/wp-json\/wp\/v2\/posts\/56\/revisions\/65"}],"wp:attachment":[{"href":"http:\/\/nick.txtcc.com\/index.php\/wp-json\/wp\/v2\/media?parent=56"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/nick.txtcc.com\/index.php\/wp-json\/wp\/v2\/categories?post=56"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/nick.txtcc.com\/index.php\/wp-json\/wp\/v2\/tags?post=56"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}