2012年11月27日火曜日

ActiveX.Exeもどき

マイクロソフトさんのCodeRecipeサイトに.EXEにあるクラスを動的に呼び出して使う例が載っていたのでこれをPrismでやってみた。

以下ソース

まずは、EXEのメインルーチン

  1. unit DirZipImp;  
  2.   
  3. namespace ConsoleApplication1;  
  4.   
  5. interface  
  6.   
  7.   
  8.   
  9. type  
  10.   ConsoleApp = class  
  11.   public  
  12.     class method Main(args: array of String);  
  13.   end;  
  14.   
  15. implementation  
  16.   
  17. class method ConsoleApp.Main(args: array of String);  
  18. begin  
  19.   // add your own code here  
  20.   Console.WriteLine('ならやめれば、うそよ');  
  21.  Console.ReadLine();  
  22. end;  
  23.   
  24. end.  

次に、EXEに含まれるクラス
  1. namespace ActiveXExeLib;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   System.Collections.Generic,  
  7.   System.Text;  
  8.   
  9. type  
  10.   Class1 = public class  
  11.   private  
  12.   protected  
  13.   public  
  14.   method CallYourName : String;  
  15.   end;  
  16.   
  17. implementation  
  18.   
  19. method Class1.CallYourName: String;  
  20. begin  
  21.  result := 'いーや';  
  22. end;  

最後に上記のクラスライブラリを動的に呼び足してるExe
  1. namespace ConsoleApplication2;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.  System.Reflection;  
  7.   
  8.   
  9.   
  10. type  
  11.   ConsoleApp = class  
  12.   public  
  13.     class method Main(args: array of String);  
  14.   end;  
  15.   
  16. implementation  
  17.   
  18. class method ConsoleApp.Main(args: array of String);  
  19. var  
  20.  m : &Assembly;  
  21.   
  22. begin  
  23.   
  24.   // add your own code here  
  25.   //Console.WriteLine('Hello World.');  
  26.   
  27.  m := &Assembly.LoadFrom(args[0]);  
  28.  var instance1: Dynamic := Activator.CreateInstance(m.GetType('ActiveXExeLib.Class1'));  
  29.  Console.WriteLine(instance1.CallYourName());  
  30.  Console.ReadLine();  
  31.   
  32. end;  
  33.   
  34. end.  
ConsoleApplication1.exeを呼び出すと

'ならやめれば、うそよ'

と表示され

ConsoleApplication2.Exeを引数に ConsoleApplication1.exe を与えて呼び出すと

'いーや'

と表示されます。


なお、Assemblyは、Prism(Oxgene)の予約語なので、手前&をつけないと.Netのクラスと
認識されないので注意が必要です。

また、Dynamicを型推論の意味でつかうには、RemObjects.Oxgene.Dynamic.dllの
参照登録が必要となります。


0 件のコメント: