プログラム言語 外部プログラム連æº

概è¦

å¿…è¦ãªæ©Ÿèƒ½ãŒå¤§ããã€é–‹ç™ºã«è¦ã™ã‚‹æ™‚é–“ãŒçŸ­ã„昨今ã€
プログラムã®å…¨ã¦ã‚’自分ã§é–‹ç™ºã™ã‚‹ã®ã¯åŠ¹çŽ‡ãŒæ‚ªã„。
他人ãŒä½œã£ãŸãƒ—ログラムをソースã§ãªãDLLã®ã¾ã¾åˆ©ç”¨ã™ã‚‹ç‚ºã®æ–¹æ³•。
他言語ã§é–‹ç™ºã•れãŸãƒ—ログラムã§ã‚ã£ã¦ã‚‚ãれã¯å¯èƒ½ã€‚

å‚考

Windowsã¯ãªãœå‹•ãã®ã‹
Windowsã®ä»•組ã¿(.NET Frameworkã¨ã¯ï¼Ÿ)
Windowsプログラミング

マーシャリング

ç•°ãªã‚‹ã‚·ã‚¹ãƒ†ãƒ ã¸ãƒ‡ãƒ¼ã‚¿ã‚’渡ã™å ´åˆã«æ¸¡ã—å…ˆã§æœ‰åйãªåž‹ã¸å¤‰æ›ã™ã‚‹ã“ã¨ã€‚
マãƒãƒ¼ã‚¸ç’°å¢ƒã®ãƒ—ログラムã‹ã‚‰ã€ã‚¢ãƒ³ãƒžãƒãƒ¼ã‚¸ç’°å¢ƒã§å‹•作ã™ã‚‹ãƒ—ログラムを呼ã³å‡ºã™éš›ã«ãƒžãƒ¼ã‚·ãƒ£ãƒªãƒ³ã‚°ãŒå¿…è¦ã«ãªã‚‹ã€‚

マーシャラー

マーシャリングを行ã†ãƒ—ログラム。

マãƒãƒ¼ã‚¸ç’°å¢ƒ

CLR(CommonLanguageRuntime)ã«ã‚ˆã£ã¦ç®¡ç†ã•れãŸç’°å¢ƒã€‚
ガーベッジコレクションã€ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£æ©Ÿèƒ½ç­‰ã®.NetFrameworkã®æ©Ÿèƒ½ã‚’æä¾›ã™ã‚‹å®Ÿè¡Œã‚¨ãƒ³ã‚¸ãƒ³ã€‚
ガーベッジコレクションã®å‹•作をå«ã‚€ãƒ¡ãƒ¢ãƒªç®¡ç†ã€é…列・文字列ã®é•·ã•管ç†ãŒè‡ªå‹•ã§è¡Œã‚れる。

アンマãƒãƒ¼ã‚¸ç’°å¢ƒ

上記以外ã®ç’°å¢ƒã€‚
Win32APIã€COMオブジェクトã€C/C++ç­‰ã€å¤šè¨€èªžã§ä½œã‚‰ã‚ŒãŸãƒ—ログラム等。
ãƒãƒƒãƒ•ã‚¡ãŒã‚ªãƒ¼ãƒãƒ¼ãƒ•ローã—ãªã„様ã€ã‚¬ãƒ¼ãƒ™ãƒƒã‚¸ã‚³ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã®å‹•作ã«è©²å½“ã™ã‚‹ä½¿ã„終ã‚ã£ãŸãƒ¡ãƒ¢ãƒªã®ç ´æ£„ç­‰ã®å‡¦ç†ã¯è‡ªå‹•ã§ã¯è¡Œã‚れãªã„。

COM相互é‹ç”¨

マーシャリングを行ã£ãŸä¸Šã§.NetFrameworkâ†â†’WindowsAPIã§ãƒ‡ãƒ¼ã‚¿ã‚’やりå–りを行ã†äº‹ã€‚

ウィンドウãƒãƒ³ãƒ‰ãƒ«

WindowsAPIã«ãŠã„ã¦æ“作対象毎ã«å‰²ã‚ŠæŒ¯ã‚‰ã‚Œã‚‹ç®¡ç†ç•ªå·
æ“作対象ã¸ã®ãƒã‚¤ãƒ³ã‚¿

実例

DLL(API)

APIã¨ã¯ï¼Ÿ
「Windowsプログラミング/APIã€å‚ç…§

using System.Runtime.InteropServices;

class MyWin32
{
  [DllImport("USER32.DLL", EntryPoint = "MessageBoxA")]
  public static extern int myMessageBox(
    int hWnd,
    String lpText,
    String lpCaption,
    uint uType);
  
  ※USER32.DLLã«ãŠã‘ã‚‹MessageBoxAã‚’myMessageBoxã¨ã—ã¦å®£è¨€
  
  public const int MB_OK = 0x00000000;
  public const int MB_OKCANCEL = 0x00000001;
  public const int MB_ABORTRETRYIGNORE = 0x00000002;
  public const int MB_YESNOCANCEL = 0x00000003;
  public const int MB_YESNO = 0x00000004;
  public const int MB_RETRYCANCEL = 0x00000005;

}

public partial class MyForm : Form
{
  private void MyForm_Load(object sender, EventArgs e)
  {

    MyWin32.myMessageBox(
      hWnd: 0,
      lpText: "メッセージ",
      lpCaption: "キャプション",
      uType: MyWin32.MB_YESNO);
  }
}

VB外部ã®é–¢æ•°(Windows API/DLL)を呼ã³å‡ºã™å ´åˆã«å®šç¾©
Public Declare Auto Function GetUserNameA Lib "advapi32" (ByVal buf as string, size as long) As Long

Public Declare Auto Function(åˆã¯Sub) [VBã§ä½¿ã†é–¢æ•°å]
Lib "[DLLファイルå]"
Alias "[DLL内ã®å®Ÿéš›ã®ãƒ•ァイルå]" ([ファイルã®å¼•æ•°]) As [戻り値ã®åž‹]

Lib:DLLファイルを指定。拡張å­ã‚’抜ãã‚‚OK

Alias:DLL 内ã®é–¢æ•°åã¨åˆ¥åã§å‘¼ã³å‡ºã™ã“ã¨ãŒã§ãる。指定無ã—ã‚‚å¯
Public Declare Function GetUserName Lib "advapi32" Alias "GetUserNameA" (ByVal buf as string, size as long) As Long
Call GetUserName(引数)

Declare 定義ã—ãŸå¾Œã¯ã€é€šå¸¸ã®é–¢æ•°ã¨åŒã˜ã«å‘¼ã³å‡ºã›ã‚‹ã€‚
å°šã€Windows API ã‚„ C ã§ä½œã‚‰ã‚ŒãŸ DLL ã®ãƒ‘ラメタã¯ä¸€èˆ¬ã«å€¤æ¸¡ã—ãªã®ã§ã€ByVal キーワードãŒå¿…è¦ã€‚

VB外部ã®é–¢æ•°(Windows API/DLL)を呼ã³å‡ºã™å ´åˆã«å®šç¾©
Public Declare Function GetUserNameA Lib "advapi32" (ByVal buf as string, size as long) As Long

Public Declare Function(åˆã¯Sub) [VB.NETã§ä½¿ã†é–¢æ•°å]
Lib "[DLLファイルå]"
Alias "[DLL内ã®å®Ÿéš›ã®ãƒ•ァイルå]" ([ファイルã®å¼•æ•°]) As [戻り値ã®åž‹]

Lib:DLLファイルを指定。拡張å­ã‚’抜ãã‚‚OK

Alias:DLL 内ã®é–¢æ•°åã¨åˆ¥åã§å‘¼ã³å‡ºã™ã“ã¨ãŒã§ãる。指定無ã—ã‚‚å¯
Public Declare Function GetUserName Lib "advapi32" Alias "GetUserNameA" (ByVal buf as string, size as long) As Long
Call GetUserName(引数)

Declare 定義ã—ãŸå¾Œã¯ã€é€šå¸¸ã®é–¢æ•°ã¨åŒã˜ã«å‘¼ã³å‡ºã›ã‚‹ã€‚
å°šã€Windows API ã‚„ C ã§ä½œã‚‰ã‚ŒãŸ DLL ã®ãƒ‘ラメタã¯ä¸€èˆ¬ã«å€¤æ¸¡ã—ãªã®ã§ã€ByVal キーワードãŒå¿…è¦ã€‚

Private Declare Function 公開å Lib "DLLå" Alias "別å" (ByVal 引数1 As Long, ・・・) As Long
Private Declare Function 公開å Lib "DLLå" Alias "別å" () As Long
Private Declare Function 公開å Lib "DLLå" () As Long

Private Declare Sub 公開å Lib "DLLå" Alias "別å" (ByVal 引数1 As Long, ・・・)
Private Declare Sub 公開å Lib "DLLå" (ByVal 引数1 As Long, ・・・)
Private Declare Sub 公開å Lib "DLLå" ()
※DLLå:DLLã¯å®Ÿè¡Œãƒ•ァイルã¨åŒéšŽå±¤ã«é…ç½®ã™ã‚‹ã‹ã€ãƒ‘スを記載ã™ã‚‹ã€‚

Dim myApi As Long
myApi = 公開å(5,5)
Call 別å(5,5)

DLL(ActiveX)

ActiveXã¨ã¯ï¼Ÿ
「Windowsプログラミング/APIã€å‚ç…§

Dim myObj As Object
myObje = CreateObject("~")
Call myObje.メソッド(~)
myObje.プロパティ = ~
DLL(COM)

COMã¨ã¯ï¼Ÿ
「Windowsプログラミング/COMã€å‚ç…§

「å‚照設定ã€ã«ã‚ˆã‚‹DLLã®ãƒ‘ス設定ãŒå¿…è¦
COMコンãƒãƒ¼ãƒãƒ³ãƒˆã§ãªã„DLLã¯å‚照設定ã§ããªã„。
DLLã®COM登録ã¯ã€Œ.NETã§ä½œæˆã—ãŸDLLã‚’VB6ã‹ã‚‰å‘¼ã³å‡ºã™æ–¹æ³•ã€å‚ç…§

Dim myObj As New ~
Call myObje.メソッド(~)
myObje.プロパティ = ~

EXE

éžåŒæœŸã§èµ·å‹•。※呼ã³å‡ºã—å…ƒPGã¯å®Ÿè¡Œã•れãŸã¾ã¾ã€‚

' メモ帳を起動ã™ã‚‹
Call Shell("Notepad", vbNormalFocus)

' タスクIDã‚’å–å¾—(≠Windowsãƒãƒ³ãƒ‰ãƒ«)
Dim RetVal As Variant
RetVal = Shell("notepad", vbNormalFocus)
' Windowをアクティブã«(≠最å°åŒ–解除)
Call AppActivate(RetVal)

' ファイルを指定ã—ã¦ãƒ¡ãƒ¢å¸³ã‚’èµ·å‹•ã™ã‚‹
Call Shell("Notepad C:\test.txt", vbNormalFocus)

' 引数ãŒã‚¹ãƒšãƒ¼ã‚¹ã‚’å«ã‚€å ´åˆ
Call Shell("""~.exe"" ""2015/05/08 10:00:00""", vbNormalFocus)

vbHide(0)
フォーカスをæŒã¡ã€éžè¡¨ç¤º
vbNormalFocus(1)
フォーカスをæŒã¡ã€å…ƒã®ã‚µã‚¤ã‚ºã¨ä½ç½®ã«å¾©å…ƒ
vbMinimizedFocus(2)
フォーカスをæŒã¡ã€æœ€å°åŒ–表示
vbMaximizedFocus(3)
フォーカスをæŒã¡ã€æœ€å¤§åŒ–表示
vbNormalNoFocus(4)
フォーカスをæŒãŸãšã€æœ€å¾Œã«ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ãŸã¨ãã®ã‚µã‚¤ã‚ºã¨ä½ç½®ã«å¾©å…ƒ
※ç¾åœ¨ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¯ã€ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã®ã¾ã¾
vbMinimizedNoFocus(6)
フォーカスをæŒãŸãšã€æœ€å°åŒ–表示
※ç¾åœ¨ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¯ã€ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã®ã¾ã¾

System.Diagnostics.Process p =
  System.Diagnostics.Process.Start("notepad.exe");

//コマンドライン引数ã«ã€Œ"C:\test\1.txt"ã€ã‚’指定ã—ã¦ãƒ¡ãƒ¢å¸³ã‚’èµ·å‹•ã™ã‚‹
System.Diagnostics.Process.Start("notepad.exe", @"""C:\test\1.txt""");

プロセスã®çµ‚了を検知ã™ã‚‹

using System.Diagnostics;

static void Main()
{
  // プログラムを起動ã—プロセスã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’å–å¾—
  Process hProcess = Process.Start(
    fileName: @"C:\Test.exe",
    arguments: @"prm1 prm2 prm3");
  
  // ↑プロセスãŒçµ‚了ã—ãŸæ™‚ã«Exitedイベントを発生ã•ã›ã‚‹
  hProcess.EnableRaisingEvents = true;
  
  // Exitedイベントã®ãƒãƒ³ãƒ‰ãƒ©ã‚’追加ã™ã‚‹
  hProcess.Exited += new System.EventHandler(Test_Exited);
  
  // 監視ã®ç‚ºã«ã‚¢ãƒ—リケーションを起動ã•ã›ã¦ãŠãå¿…è¦ã‚り。
  // タスクãƒãƒ¼ã«ã¯è¡¨ç¤ºã•れãªã„ãŒãƒ—ロセスã¯èµ·å‹•ã™ã‚‹
  Application.Run();
}

private static void Test_Exited(object sender, System.EventArgs e)
{
  プロセス終了時ã€ã“ã“ãŒå‘¼ã°ã‚Œã‚‹
}

Follow me!