Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Question: How can I remove an application function and replace calls to it with something different?

Answer: You may try this in your translation configuration

First of all, an option that should be considered is to keep your original calls as is, but to fine tune the implementation to use .NET by hand. Then, use a Author/Replace or related command to to swap in in your fine-tuned code.  

However, if you really want to change the calls, You may add some refactoring commands to your translation script.  In the <compile> section of the script, do a remove/remove-stubout with a migPattern.  This will rework the calls. Then, after the <analyse> section, use refactor/remove-delete to remove the original. Something like this.
Example1: Here is an example you can try using our ScanTool sample:

Code Block
<Compile Project="%SrcPath%">
<refactor>
<remove identifier="ScanToolLib.readNode" migStatus="stubout" migPattern="%1d.ReadXMLNode(%2d))" />
</refactor>
</Compile>
<Analyse />
...
<refactor>
    <remove identifier="ScanToolLib.readNode" migStatus="delete" />
</refactor>
...
<Author>

Since the methods to be refactored are in a module, these rules will be needed for each VBP that uses the module – unless you moved the module to an IDF using the SharedFile command. 

Another option that is has some appeal is to keep your original application interface calls as is, but to fine tune the implementation to use .NET by hand. Then, use author/replacefile to drop in your fine-tuned file. It really depends on what you are doing … and if you want to preserve the interface or not.

 

Example 2: I have a Declare in a SharedFile, that I want to migrate to a Framework call:

Code Block
Vb6
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
...
Sleep 500

We want no declaration and calls like this:

...
System.Threading.Thread.Sleep(500);

To make things more interesting this Declare was in a module that was shared throughout the system;  the declaration is being moved into a host project using the Shared

Code Block
<Compile Condition="%SrcName%=='AppCommon'">
   <Refactor>
      <Migrate id="GlobalDeclarations.Sleep" nPram="2" migName="System.Threading.Thread.Sleep" migStatus="external" />
   </Refactor>
</Compile>

Changes the calls in AppCommon as expected

The Migrate command also adds a migName to the FromCode IDF generated for the translation:

Code Block
FromCode\AppCommon.dll.xml

      <method id="Sleep" migName="System.Threading.Thread.Sleep" type="Void">
         <argument id="dwMilliseconds" type="Integer" status="ByVal"/>
      </method>

The migName attribute alters calls made to the method the codes that reference AppCommon.DLL.

Note that in this case, a "migrated" declaration is authored in the generated DLL code; it must be removed with an Author\Fix.

Code Block
<Author Condition="%SrcName%=='AppCommon'">
<Fix host="%SrcName%" name="PostEdit">
   <Replace name="Remove GlobalDeclaration.Sleep">
   <OldBlock><![CDATA[
         [DllImport("kernel32")]
         public static extern void System.Threading.Thread.Sleep(int dwMilliseconds);
   ]]></OldBlock>      
   </Replace>
</Fix>
</Author>

Note: The XML above uses the Condition attribute of the ScriptRules feature.