OSDN Git Service

RFE: [ 1017179 ] Plugin readme's as HTML?
authorTim Gerundt <tim@gerundt.de>
Thu, 2 Jun 2005 21:26:54 +0000 (21:26 +0000)
committerTim Gerundt <tim@gerundt.de>
Thu, 2 Jun 2005 21:26:54 +0000 (21:26 +0000)
Docs/Developers/Plugins.html [new file with mode: 0644]
Docs/Developers/readme.txt
Plugins/readme.txt
Plugins/readme_developpers.txt [deleted file]
Plugins/syntax.txt [deleted file]

diff --git a/Docs/Developers/Plugins.html b/Docs/Developers/Plugins.html
new file mode 100644 (file)
index 0000000..65d7d6d
--- /dev/null
@@ -0,0 +1,424 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+  "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+  <title>Plugins</title>
+  <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+  <style type="text/css">
+  <!--
+    h3 {
+      padding: 2px;
+      border-left: 4px solid #FFCC00;
+      border-bottom: 1px solid #FFCC00;
+    }
+    h4 {
+      padding: 2px;
+      border-left: 8px solid #FF9933;
+      border-bottom: 1px solid #FF9933;
+    }
+    table {
+      border-collapse: collapse;
+      border: 1px solid black;
+    }
+    th {
+      text-align: left;
+      padding: 3px;
+      background-color: #EEEEEE;
+      border: 1px solid black;
+    }
+    td {
+      padding: 3px;
+      border: 1px solid black;
+    }
+    dt {
+      font-weight: bold;
+    }
+  -->
+  </style>
+</head>
+<body>
+<h2>Plugins</h2>
+
+<h3>Table of Contents</h3>
+<ul>
+  <li><a href="#description">Quick description</a></li>
+  <li><a href="#events">Events</a></li>
+  <li><a href="#api">API</a></li>
+  <li><a href="#properties">Properties</a></li>
+  <li><a href="#methods">Methods</a></li>
+  <li><a href="#syntax">Syntax</a>
+    <ul>
+      <li><a href="#syntax_properties">Properties syntax</a></li>
+      <li><a href="#syntax_methods">Methods syntax</a></li>
+    </ul>
+  </li>
+  <li><a href="#write">How to write plugins quickly ?</a></li>
+  <li><a href="#debug">How to debug VC++ plugins ?</a></li>
+</ul>
+
+<h3><a name="description">Quick description</a></h3>
+<p>Plugins use an ActiveX interface. Plugins may be written in any format that supports this interface.</p>
+<p>Examples are available in :</p>
+<ul>
+  <li>C++ COM component</li>
+  <li>VB ActiveX dll</li>
+  <li>Scriptlets (VBS, JS)</li>
+  <li>Delphi</li>
+</ul>
+<p>Limitation : Scriptlets only work for <code>EDITOR_SCRIPT</code> plugins.</p>
+<p><a href="#properties">Properties</a> are used to present information concerning the plugin.<br />
+<a href="#methods">Methods</a> are used to process the data. Method names and syntax depends on events and <a href="#api">API</a> (see below).</p>
+
+<h3><a name="events">Events</a></h3>
+<dl>
+  <dt><code>EDITOR_SCRIPT</code></dt>
+  <dd><p>In editor view, apply a function to the current selection.</p></dd>
+
+  <dt><code>PREDIFF</code></dt>
+  <dd>
+    <p>Preprocess file before diffing : the plugin is not apply to the text displayed in the editor. It is applied only to a copy of the left and right texts, and this copy are then scanned to create the difference list. As now :</p>
+    <ul>
+      <li>you may delete one column, change the names of variables...</li>
+      <li>you may not add/delete/move lines.</li>
+    </ul>
+  </dd>
+
+  <dt><code>PACK_UNPACK</code></dt>
+  <dd>
+    <p>Transform a file in a viewable format (for example, decompress a file...)</p>
+    <ul>
+      <li>The editor displays the unpacked data.</li>
+      <li>Sometimes files may be packed again (zipped files...). An additionnal function is of course necessary.</li>
+      <li>If the author of the plugin created this function, file may be saved again in the compressed format.</li>
+      <li>Else the file can only be saved in a text format. To avoid problems, you are proposed to change the filename when saving a changed file.</li>
+    </ul>
+  </dd>
+</dl>
+
+<h3><a name="api">API</a></h3>
+<p>Some events have two API. One to exchange the data through a <code>BSTR</code> (memory) and one through input/ouput files.</p>
+
+<table border="1">
+  <tr>
+    <td><code>FILE_PREDIFF</code></td>
+    <td>data are exchanged through an input and an output file</td>
+  </tr>
+  <tr>
+    <td><code>BUFFER_PREDIFF</code></td>
+    <td>data are exchanged through a <code>BSTR</code></td>
+  </tr>
+  <tr>
+    <td><code>FILE_PACK_UNPACK</code></td>
+    <td>data are exchanged through an input and an output file</td>
+  </tr>
+  <tr>
+    <td><code>BUFFER_PACK_UNPACK</code></td>
+    <td>data are exchanged through a <code>SafeArray</code> (<code>BSTR</code> not available as the packed data are possibly not text)</td>
+  </tr>
+  <tr>
+    <td><code>EDITOR_SCRIPT</code></td>
+    <td>data are exchanged through a <code>BSTR</code></td>
+  </tr>
+</table>
+<p>You need to define only one API to handle an event. Define the one you prefer.</p>
+
+<h3><a name="properties">Properties</a></h3>
+<table border="1">
+  <tr>
+    <th>Name</th>
+    <th>Mandatory</th>
+    <th>Events</th>
+  </tr>
+  <tr>
+    <td><code>PluginEvent</code></td>
+    <td>yes</td>
+    <td>all</td>
+  </tr>
+  <tr>
+    <td><code>PluginDescription</code></td>
+    <td>no</td>
+    <td>all</td>
+  </tr>
+  <tr>
+    <td><code>PluginFileFilters</code></td>
+    <td>no</td>
+    <td><code>PACK_UNPACK</code>, <code>PREDIFF</code></td>
+  </tr>
+  <tr>
+    <td><code>PluginIsAutomatic</code></td>
+    <td>if <code>PluginFileFilters</code> is defined</td>
+    <td><code>PACK_UNPACK</code>, <code>PREDIFF</code></td>
+  </tr>
+</table>
+
+<p><code>PluginIsAutomatic</code> and <code>PluginFileFilters</code> are for automatic mode :</p>
+<ul>
+  <li>When <code>PluginIsAutomatic</code> is <code>false</code>, the plugin is never used in automatic mode.</li>
+  <li>When <code>PluginIsAutomatic</code> is <code>true</code>, <code>PluginFileFilters</code> is compared to the filename of both files. If one file
+      matches the filter, the plugin is applied.</li>
+</ul>
+
+<h3><a name="methods">Methods</a></h3>
+<table border="1">
+  <tr>
+    <th>API</th>
+    <th>Method name</th>
+  </tr>
+  <tr>
+    <td><code>EDITOR_SCRIPT</code></td>
+    <td>function name is free<br /><br /><b>Note</b> : several functions may be defined in one <code>EDITOR_SCRIPT</code> plugin</td>
+  </tr>
+  <tr>
+    <td><code>BUFFER_PREDIFF</code></td>
+    <td><code>PrediffBufferW</code></td>
+  </tr>
+  <tr>
+    <td><code>FILE_PREDIFF</code></td>
+    <td><code>PrediffFile</code></td>
+  </tr>
+  <tr>
+    <td><code>BUFFER_PACK_UNPACK</code></td>
+    <td><code>UnpackBufferA</code><br /><code>PackBufferA</code></td>
+  </tr>
+  <tr>
+    <td><code>FILE_PACK_UNPACK</code></td>
+    <td><code>UnpackFile</code><br /><code>PackFile</code></td>
+  </tr>
+</table>
+
+<p><b>Note</b> : <code>PACK_UNPACK</code> functions use an additionnal parameter. The value may be set during <code>UnpackBuffer</code>.
+When file is changed, the value is forwarded to <code>PackBuffer</code>.
+The goal is to pass a parameter from <code>UnpackBuffer</code> to <code>PackBuffer</code>.<br />
+For example, the plugin may handle several compressed formats, and use this value to recompress a file in
+the format of the original.
+This parameter is mandatory for the functions syntax. But you don't have to set its value when you don't use it.</p>
+
+<h3><a name="syntax">Syntax</a></h3>
+
+<h3><a name="syntax_properties">Properties syntax</a></h3>
+
+<h4><code>PluginEvent</code></h4>
+<table border="1">
+  <tr>
+    <th>C++</th>
+    <td><code>STDMETHODIMP CWinMergeScript::get_PluginEvent(BSTR * pVal)</code></td>
+  </tr>
+  <tr>
+    <th>VB</th>
+    <td><code>Public Property Get PluginEvent() As String</code></td>
+  </tr>
+  <tr>
+    <th>VBS</th>
+    <td><code>Function get_PluginEvent()</code></td>
+  </tr>
+</table>
+
+<h4><code>PluginDescription</code></h4>
+<table border="1">
+  <tr>
+    <th>C++</th>
+    <td><code>STDMETHODIMP CWinMergeScript::get_PluginDescription(BSTR * pVal)</code></td>
+  </tr>
+  <tr>
+    <th>VB</th>
+    <td><code>Public Property Get PluginDescription() As String</code></td>
+  </tr>
+  <tr>
+    <th>VBS</th>
+    <td><code>Function get_PluginDescription()</code></td>
+  </tr>
+</table>
+
+<h4><code>PluginFileFilters</code></h4>
+<p>String formed of fileFilters, separated with "<code>;</code>"</p>
+<table border="1">
+  <tr>
+    <th>C++</th>
+    <td><code>STDMETHODIMP CWinMergeScript::get_PluginFileFilters(BSTR * pVal)</code></td>
+  </tr>
+  <tr>
+    <th>VB</th>
+    <td><code>Public Property Get PluginFileFilters() As String</code></td>
+  </tr>
+</table>
+
+<h4><code>PluginIsAutomatic</code></h4>
+<table border="1">
+  <tr>
+    <th>C++</th>
+    <td><code>STDMETHODIMP CWinMergeScript::get_PluginIsAutomatic(VARIANT_BOOL * pVal)</code></td>
+  </tr>
+  <tr>
+    <th>VB</th>
+    <td><code>Public Property Get PluginIsAutomatic() As Boolean</code></td>
+  </tr>
+</table>
+
+<h3><a name="syntax_methods">Methods syntax</a></h3>
+
+<h4><code>EDITOR_SCRIPT</code></h4>
+<table border="1">
+  <tr>
+    <th></th>
+    <th>Functions parameters (function names are free)</th>
+  </tr>
+  <tr>
+    <th>C++</th>
+    <td><code>STDMETHOD(MakeUpperVB)([in] BSTR inputText, [out, retval] BSTR * outputText);</code></td>
+  </tr>
+  <tr>
+    <th>VB</th>
+    <td><code>Public Function MakeUpperVB(text As String)</code></td>
+  </tr>
+  <tr>
+    <th>VBS</th>
+    <td><code>Function MakeUpperVBS(Text)</code></td>
+  </tr>
+</table>
+
+<h4><code>FILE_PREDIFF</code></h4>
+<table border="1">
+  <tr>
+    <th></th>
+    <th>Functions names</th>
+    <th>Functions parameters</th>
+  </tr>
+  <tr>
+    <th>VC++</th>
+    <td><code>STDMETHOD(PrediffFile)</code></td>
+    <td><code>([in] BSTR fileSrc, [in] BSTR fileDst, VARIANT_BOOL * pbChanged, INT * pSubcode, [out, retval] VARIANT_BOOL * pbSuccess)</code></td>
+  </tr>
+  <tr>
+    <th>VB</th>
+    <td><code>Public Function PrediffFile</code></td>
+    <td><code>(BSTR fileSrc, BSTR fileDst, ByRef bChanged As Boolean, ByRef subcode As Long) As Boolean</code></td>
+  </tr>
+</table>
+
+<h4><code>BUFFER_PREDIFF</code></h4>
+<table border="1">
+  <tr>
+    <th></th>
+    <th>Functions names</th>
+    <th>Functions parameters</th>
+  </tr>
+  <tr>
+    <th>C++</th>
+    <td><code>STDMETHOD(PrediffBufferW)</code></td>
+    <td><code>([in] BSTR * pText, [in] INT * pSize, [in] VARIANT_BOOL * pbChanged, [out, retval] VARIANT_BOOL * pbHandled);</code></td>
+  </tr>
+  <tr>
+    <th>VB</th>
+    <td><code>Public Function PrediffBufferW</code></td>
+    <td><code>(ByRef text As String, ByRef size As Long, ByRef bChanged As Boolean) As Boolean</code></td>
+  </tr>
+</table>
+
+<h4><code>FILE_PACK_UNPACK</code></h4>
+<table border="1">
+  <tr>
+    <th></th>
+    <th>Functions names</th>
+    <th>Functions parameters</th>
+  </tr>
+  <tr>
+    <th>VC++</th>
+    <td><code>STDMETHOD(UnpackFile)</code></td>
+    <td><code>([in] BSTR fileSrc, [in] BSTR fileDst, VARIANT_BOOL * pbChanged, INT * pSubcode, [out, retval] VARIANT_BOOL * pbSuccess)</code></td>
+  </tr>
+  <tr>
+    <th></th>
+    <td><code>STDMETHOD(PackFile)</code></td>
+    <td><code>([in] BSTR fileSrc, [in] BSTR fileDst, VARIANT_BOOL * pbChanged, INT pSubcode, [out, retval] VARIANT_BOOL * pbSuccess)</code></td>
+  </tr>
+  <tr>
+    <th>VB</th>
+    <td><code>Public Function UnpackFile</code></td>
+    <td><code>(BSTR fileSrc, BSTR fileDst, ByRef bChanged As Boolean, ByRef subcode As Long) As Boolean</code></td>
+  </tr>
+  <tr>
+    <th></th>
+    <td><code>Public Function PackFile</code></td>
+    <td><code>(BSTR fileSrc, BSTR fileDst, ByRef bChanged As Boolean, subcode As Long) As Boolean</code></td>
+  </tr>
+</table>
+
+<h4><code>BUFFER_PACK_UNPACK</code></h4>
+<table border="1">
+  <tr>
+    <th></th>
+    <th>Functions names</th>
+    <th>Functions parameters</th>
+  </tr>
+  <tr>
+    <th>VC++</th>
+    <td><code>STDMETHOD(UnpackBufferA)</code></td>
+    <td><code>([in] SAFEARRAY ** pBuffer, [in] INT * pSize, [in] VARIANT_BOOL * pbChanged, [in] INT * pSubcode, [out, retval] VARIANT_BOOL * pbSuccess)</code></td>
+  </tr>
+  <tr>
+    <th></th>
+    <td><code>STDMETHOD(PackBufferA)</code></td>
+    <td><code>([in] SAFEARRAY ** pBuffer, [in] INT * pSize, [in] VARIANT_BOOL * pbChanged, [in] INT subcode, [out, retval] VARIANT_BOOL * pbSuccess)</code></td>
+  </tr>
+  <tr>
+    <th>VB</th>
+    <td><code>Public Function UnpackBufferA</code></td>
+    <td><code>(ByRef buffer() As Byte, ByRef size As Long, ByRef bChanged As Boolean, ByRef subcode As Long) As Boolean</code></td>
+  </tr>
+  <tr>
+    <th></th>
+    <td><code>Public Function PackBufferA</code></td>
+    <td><code>(ByRef buffer() As Byte, ByRef size As Long, ByRef bChanged As Boolean, subcode As Long) As Boolean</code></td>
+  </tr>
+</table>
+
+<h3><a name="write">How to write plugins quickly ?</a></h3>
+<p>Easiest plugins are scriptlets.</p>
+<p>Just VBscript (or JavaScript probably) with an additionnal section <code>&lt;implement&gt;</code>. See examples.<br />
+But they are difficult to debug. And valid only for <code>EDITOR_SCRIPT</code> events.</p>
+
+<h4>VC++ plugins :</h4>
+<p>The most difficult to write when you do it from scratch. See in <code>Plugins/syntax.txt</code>, there are three additionnal steps from normal COM dll.</p>
+<p>But easy to write from an existing plugin.</p>
+<ol>
+  <li>Select a C++ plugin with the same API</li>
+  <li>Rename the files <code>cpp,def,dsp,idl,rc</code> : replace [<em>name of old plugin</em>] with [<em>name of your plugin</em>]</li>
+  <li>In all the files, replace all instances of [<em>name of old plugin</em>] with [<em>name of your plugin</em>]</li>
+  <li>Write your custom code : <code>WinMergeScript.cpp</code> holds all the important functions.</li>
+</ol>
+
+<h4>Additionnal steps to write a plugin in C++</h4>
+<ul>
+  <li>do not register the dll : delete everything in 'settings'->'custom build'</li>
+  <li>do not register the dll : delete the file <code>.rgs</code>, and the registry section in the file <code>.rc</code></li>
+  <li>do not register the dll : add <code>typeinfoex.h</code> + and make 3 changes in <code>WinMergeScript.h</code> (see commented lines)</li>
+  <li><code>SAFEARRAY</code> : replace the interface in <code>.idl</code> :
+    <ul>
+      <li><code>SAFEARRAY *</code>             <code>SAFEARRAY(unsigned char)</code></li>
+      <li><code>SAFEARRAY **</code>            <code>SAFEARRAY(unsigned char) *</code></li>
+    </ul>
+  </li>
+</ul>
+
+<h3><a name="debug">How to debug VC++ plugins ?</a></h3>
+<p>Easy with Visual Studio after you installed WinMerge source.</p>
+
+<h4><code>EDITOR_SCRIPT</code> :</h4>
+<ol>
+  <li>Set a breakpoint at the beginning of <code>safeInvokeA</code> in <code>Plugins.cpp</code>.</li>
+  <li>Run WinMerge</li>
+  <li>Do all you need (open file, menu...) to call the plugin.</li>
+  <li>The breakpoint is triggered. The plugin interface is loaded at this moment.
+      Open the file <code>WinMergeScript.cpp</code> source of your plugin in the debugging session.</li>
+  <li>Set a breakpoint in this file at the beginning of your function.</li>
+  <li><code>F5</code>. The breakpoint in your function is triggered.</li>
+</ol>
+
+<h4><code>PREDIFF</code>, <code>PACK_UNPACK</code> :</h4>
+<p>Same steps, point #1 only differs:</p>
+<ol>
+  <li>Set a breakpoint at the beginning of <code>safeInvokeW</code> in <code>Plugins.cpp</code>.<br /><br />
+      <b>Note</b> : <code>safeInvokeW</code> instead of <code>safeInvokeA</code>.</li>
+</ol>
+</body>
+</html>
\ No newline at end of file
index 98fd976..6719c5b 100644 (file)
@@ -1,3 +1,7 @@
+2005-06-02 Tim
+ RFE: [ 1017179 ] Plugin readme's as HTML?
+  Developers: new file Plugins.html
+
 2005-05-11 Kimmo
  Options are now initialized in CMainFrame::OptionsInit() in OptionsInit.cpp
   Developers: Options.html
index 548b7e6..0afc3fa 100644 (file)
@@ -1,3 +1,7 @@
+2005-06-02 Tim
+ RFE: [ 1017179 ] Plugin readme's as HTML?
+  Plugins: remove files readme_developpers.txt syntax.txt
+
 2005-05-21 Perry
  PATCH [ 1206215 ] Fix DisplayBinaryFiles dll source to compile
  BUG [ 1206209 ] DisplayBinaryFiles.dll does not compile under MSVC7 (2003)
diff --git a/Plugins/readme_developpers.txt b/Plugins/readme_developpers.txt
deleted file mode 100644 (file)
index d907b14..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-
-Events 
-======
-Please read first readme_users.txt
-
-
-Plugin selection
-================
-Please read first readme_users.txt
-
-
-Quick description
-=================
-Plugins use an ActiveX interface.
-Plugins may be written in any format that supports this interface. Examples are available in :
-       C++ COM component
-       VB ActiveX dll
-       scriptlets (VBS,JS)
-       Delphi
-
-Properties are used to present information concerning the plugin.
-Methods are used to process the data. Method names and syntax depends on events and API (see below).
-
-
-Properties
-==========
-name                   mandatory                               events
-
-PluginEvent            yes                                     all
-PluginDescription      no                                      all
-PluginFileFilters      no                                      PACK_UNPACK, PREDIFF
-PluginIsAutomatic      if PluginFileFilters is defined         PACK_UNPACK, PREDIFF
-
-PluginIsAutomatic and PluginFileFilters are for automatic mode :
-
-When PluginIsAutomatic is false, the plugin is never used in automatic mode.
-When PluginIsAutomatic is true, PluginFileFilters is compared to the filename of both files. If one file
-matches the filter, the plugin is applied.
-
-
-API
-===
-Some events have two API. 
-One to exchange the data through a BSTR (memory) and one through input/ouput files.
-
-FILE_PREDIFF           data are exchanged through an input and an output file
-BUFFER_PREDIFF         data are exchanged through a BSTR
-FILE_PACK_UNPACK       data are exchanged through an input and an output file
-BUFFER_PACK_UNPACK      data are exchanged through a SafeArray (BSTR not available as the packed data are
-                       possibly not text)
-EDITOR_SCRIPT          data are exchanged through a BSTR
-
-You need to define only one API to handle an event. Define the one you prefer.
-
-
-Methods
-=======
-API                    method name
-
-EDITOR_SCRIPT          function name is free       
-
-Note : several functions may be defined in one EDITOR_SCRIPT plugin
-
-BUFFER_PREDIFF         PrediffBufferW
-FILE_PREDIFF            PrediffFile
-
-BUFFER_PACK_UNPACK      UnpackBufferA
-                        PackBufferA
-FILE_PACK_UNPACK        UnpackFile
-                       PackFile
-
-Note : PACK_UNPACK functions use an additionnal parameter. The value may be set during UnpackBuffer.
-When file is changed, the value is forwarded to PackBuffer.
-The goal is to pass a parameter from UnpackBuffer to PackBuffer.
-For example, the plugin may handle several compressed formats, and use this value to recompress a file in
-the format of the original.
-This parameter is mandatory for the functions syntax. But you don't have to set its value when you don't use it.
-
-
-Syntax
-======
-See syntax.txt
-
-
-How to write plugins quickly ?
-==============================
-Easiest plugins are scriptlets.
-Just VBscript (or javascript probably) with an additionnal section <implement>. See examples.
-But they are difficult to debug. And valid only for EDITOR_SCRIPT events.
-
-VC++ plugins :
-The most difficult to write when you do it from scratch. See in syntax.txt, there are three additionnal steps from normal COM dll.
-But easy to write from an existing plugin.
-1) Select a C++ plugin with the same API
-2) Rename the files cpp,def,dsp,idl,rc : replace [name of old plugin] with [name of your plugin]
-3) In all the files, replace all instances of [name of old plugin] with [name of your plugin]
-4) Write your custom code : WinMergeScript.cpp holds all the important functions.
-
-
-How to debug VC++ plugins ?
-===========================
-Easy with Visual Studio after you installed WinMerge source.
-
-EDITOR_SCRIPT : 
-1) Set a breakpoint at the beginning of safeInvokeA in Plugins.cpp.
-2) Run WinMerge
-3) Do all you need (open file, menu...) to call the plugin.
-4) The breakpoint is triggered. The plugin interface is loaded at this moment. Open the file WinMergeScript.cpp
-source of your plugin in the debugging session.
-5) Set a breakpoint in this file at the beginning of your function.
-6) F5. The breakpoint in your function is triggered.
-
-PREDIFF, PACK_UNPACK : 
-Same steps, point #1 only differs
-1) Set a breakpoint at the beginning of safeInvokeW in Plugins.cpp.
-note : safeInvokeW instead of safeInvokeA.
diff --git a/Plugins/syntax.txt b/Plugins/syntax.txt
deleted file mode 100644 (file)
index 70f3e79..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-Plugins use an ActiveX interface.
-Plugins may be written in any format that supports this interface. Examples are available in :
-       C++ COM component
-       VB ActiveX dll
-       scriptlets (VBS,JS)
-       Delphi
-
-Limitation : scriptlets only work for EDITOR_SCRIPT plugins.
-
-
-Properties syntax
-=================
-                               
-PluginEvent
-C++    STDMETHODIMP CWinMergeScript::get_PluginEvent(BSTR * pVal)
-VB     Public Property Get PluginEvent() As String
-VBS    Function get_PluginEvent()
-
-PluginDescription
-C++    STDMETHODIMP CWinMergeScript::get_PluginDescription(BSTR * pVal)
-VB     Public Property Get PluginDescription() As String
-VBS    Function get_PluginDescription()
-
-PluginFileFilters
-String formed of fileFilters, separated with ";"
-C++    STDMETHODIMP CWinMergeScript::get_PluginFileFilters(BSTR * pVal)
-VB     Public Property Get PluginFileFilters() As String
-
-PluginIsAutomatic
-C++    STDMETHODIMP CWinMergeScript::get_PluginIsAutomatic(VARIANT_BOOL * pVal)
-VB     Public Property Get PluginIsAutomatic() As Boolean
-
-
-
-Methods syntax
-==============
-EDITOR_SCRIPT          Functions parameters (function names are free) :
-                       C++     STDMETHOD(MakeUpperVB)([in] BSTR inputText, [out, retval] BSTR * outputText);
-                       VB      Public Function MakeUpperVB(text As String)
-                       VBS     Function MakeUpperVBS(Text)
-
-FILE_PREDIFF           Functions names and parameters : 
-                       VC++    STDMETHOD(PrediffFile)        ([in] BSTR fileSrc, [in] BSTR fileDst, VARIANT_BOOL * pbChanged, INT * pSubcode, [out, retval] VARIANT_BOOL * pbSuccess)
-                       VB      Public Function PrediffFile   (BSTR fileSrc, BSTR fileDst, ByRef bChanged As Boolean, ByRef subcode As Long) As Boolean
-
-BUFFER_PREDIFF         Functions names and parameters : 
-                       C++     STDMETHOD(PrediffBufferW)     ([in] BSTR * pText, [in] INT * pSize, [in] VARIANT_BOOL * pbChanged, [out, retval] VARIANT_BOOL * pbHandled);
-                       VB      Public Function PrediffBufferW(ByRef text As String, ByRef size As Long, ByRef bChanged As Boolean) As Boolean
-
-FILE_PACK_UNPACK       Functions names and parameters : 
-                       VC++    STDMETHOD(UnpackFile)         ([in] BSTR fileSrc, [in] BSTR fileDst, VARIANT_BOOL * pbChanged, INT * pSubcode, [out, retval] VARIANT_BOOL * pbSuccess)
-                               STDMETHOD(PackFile)           ([in] BSTR fileSrc, [in] BSTR fileDst, VARIANT_BOOL * pbChanged, INT pSubcode, [out, retval] VARIANT_BOOL * pbSuccess)
-                       VB      Public Function UnpackFile    (BSTR fileSrc, BSTR fileDst, ByRef bChanged As Boolean, ByRef subcode As Long) As Boolean
-                               Public Function PackFile      (BSTR fileSrc, BSTR fileDst, ByRef bChanged As Boolean, subcode As Long) As Boolean
-
-BUFFER_PACK_UNPACK     Functions names and parameters : 
-                       VC++    STDMETHOD(UnpackBufferA)      ([in] SAFEARRAY ** pBuffer, [in] INT * pSize, [in] VARIANT_BOOL * pbChanged, [in] INT * pSubcode, [out, retval] VARIANT_BOOL * pbSuccess)
-                               STDMETHOD(PackBufferA)        ([in] SAFEARRAY ** pBuffer, [in] INT * pSize, [in] VARIANT_BOOL * pbChanged, [in] INT subcode, [out, retval] VARIANT_BOOL * pbSuccess)
-                       VB      Public Function UnpackBufferA (ByRef buffer() As Byte, ByRef size As Long, ByRef bChanged As Boolean, ByRef subcode As Long) As Boolean
-                               Public Function PackBufferA   (ByRef buffer() As Byte, ByRef size As Long, ByRef bChanged As Boolean, subcode As Long) As Boolean
-
-
-Additionnal steps to write a plugin in C++
-==========================================
-
-* do not register the dll : delete everything in 'settings'->'custom build'
-* do not register the dll : delete the file .rgs, and the registry section in the file .rc
-* do not register the dll : add typeinfoex.h + and make 3 changes in WinMergeScript.h (see commented lines)
-* SAFEARRAY : replace the interface in .idl :
-       SAFEARRAY *             SAFEARRAY(unsigned char)
-       SAFEARRAY **            SAFEARRAY(unsigned char) *