プãƒã‚°ãƒ©ãƒ 言語 外部プãƒã‚°ãƒ©ãƒ 連æº
目次
概è¦
å¿…è¦ãªæ©Ÿèƒ½ãŒå¤§ããã€é–‹ç™ºã«è¦ã™ã‚‹æ™‚é–“ãŒçŸã„昨今ã€
プãƒã‚°ãƒ©ãƒ ã®å…¨ã¦ã‚’自分ã§é–‹ç™ºã™ã‚‹ã®ã¯åŠ¹çŽ‡ãŒæ‚ªã„。
他人ãŒä½œã£ãŸãƒ—ãƒã‚°ãƒ©ãƒ をソースã§ãªãDLLã®ã¾ã¾åˆ©ç”¨ã™ã‚‹ç‚ºã®æ–¹æ³•。
他言語ã§é–‹ç™ºã•れãŸãƒ—ãƒã‚°ãƒ©ãƒ ã§ã‚ã£ã¦ã‚‚ãれã¯å¯èƒ½ã€‚
å‚考
Windowsã¯ãªãœå‹•ãã®ã‹
Windowsã®ä»•組ã¿(.NET Frameworkã¨ã¯ï¼Ÿ)
Windowsプãƒã‚°ãƒ©ãƒŸãƒ³ã‚°
マーシャリング
ç•°ãªã‚‹ã‚·ã‚¹ãƒ†ãƒ ã¸ãƒ‡ãƒ¼ã‚¿ã‚’渡ã™å ´åˆã«æ¸¡ã—å…ˆã§æœ‰åйãªåž‹ã¸å¤‰æ›ã™ã‚‹ã“ã¨ã€‚
マãƒãƒ¼ã‚¸ç’°å¢ƒã®ãƒ—ãƒã‚°ãƒ©ãƒ ã‹ã‚‰ã€ã‚¢ãƒ³ãƒžãƒãƒ¼ã‚¸ç’°å¢ƒã§å‹•作ã™ã‚‹ãƒ—ãƒã‚°ãƒ©ãƒ を呼ã³å‡ºã™éš›ã«ãƒžãƒ¼ã‚·ãƒ£ãƒªãƒ³ã‚°ãŒå¿…è¦ã«ãªã‚‹ã€‚
マーシャラー
マーシャリングを行ã†ãƒ—ãƒã‚°ãƒ©ãƒ 。
マãƒãƒ¼ã‚¸ç’°å¢ƒ
CLR(CommonLanguageRuntime)ã«ã‚ˆã£ã¦ç®¡ç†ã•れãŸç’°å¢ƒã€‚
ガーベッジコレクションã€ã‚»ã‚ュリティ機能ç‰ã®.NetFrameworkã®æ©Ÿèƒ½ã‚’æä¾›ã™ã‚‹å®Ÿè¡Œã‚¨ãƒ³ã‚¸ãƒ³ã€‚
ガーベッジコレクションã®å‹•作をå«ã‚€ãƒ¡ãƒ¢ãƒªç®¡ç†ã€é…列・文å—列ã®é•·ã•管ç†ãŒè‡ªå‹•ã§è¡Œã‚れる。
アンマãƒãƒ¼ã‚¸ç’°å¢ƒ
上記以外ã®ç’°å¢ƒã€‚
Win32APIã€COMオブジェクトã€C/C++ç‰ã€å¤šè¨€èªžã§ä½œã‚‰ã‚ŒãŸãƒ—ãƒã‚°ãƒ©ãƒ ç‰ã€‚
ãƒãƒƒãƒ•ã‚¡ãŒã‚ªãƒ¼ãƒãƒ¼ãƒ•ãƒãƒ¼ã—ãªã„様ã€ã‚¬ãƒ¼ãƒ™ãƒƒã‚¸ã‚³ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã®å‹•作ã«è©²å½“ã™ã‚‹ä½¿ã„終ã‚ã£ãŸãƒ¡ãƒ¢ãƒªã®ç ´æ£„ç‰ã®å‡¦ç†ã¯è‡ªå‹•ã§ã¯è¡Œã‚れãªã„。
COM相互é‹ç”¨
マーシャリングを行ã£ãŸä¸Šã§.NetFrameworkâ†â†’WindowsAPIã§ãƒ‡ãƒ¼ã‚¿ã‚’やりå–りを行ã†äº‹ã€‚
ウィンドウãƒãƒ³ãƒ‰ãƒ«
WindowsAPIã«ãŠã„ã¦æ“作対象毎ã«å‰²ã‚ŠæŒ¯ã‚‰ã‚Œã‚‹ç®¡ç†ç•ªå·
æ“作対象ã¸ã®ãƒã‚¤ãƒ³ã‚¿
実例
DLL(API)
APIã¨ã¯ï¼Ÿ
「Windowsプãƒã‚°ãƒ©ãƒŸãƒ³ã‚°/APIã€å‚ç…§
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);
  }
}
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 ã‚ーワードãŒå¿…è¦ã€‚
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ã€å‚ç…§
myObje = CreateObject("~")
Call myObje.メソッド(~)
myObje.プãƒãƒ‘ティ = ~
DLL(COM)
COMã¨ã¯ï¼Ÿ
「Windowsプãƒã‚°ãƒ©ãƒŸãƒ³ã‚°/COMã€å‚ç…§
COMコンãƒãƒ¼ãƒãƒ³ãƒˆã§ãªã„DLLã¯å‚ç…§è¨å®šã§ããªã„。
DLLã®COM登録ã¯ã€Œ.NETã§ä½œæˆã—ãŸDLLã‚’VB6ã‹ã‚‰å‘¼ã³å‡ºã™æ–¹æ³•ã€å‚ç…§
Dim myObj As New ~
Call myObje.メソッド(~)
myObje.プãƒãƒ‘ティ = ~
EXE
' メモ帳を起動ã™ã‚‹
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.Start("notepad.exe");
//コマンドライン引数ã«ã€Œ"C:\test\1.txt"ã€ã‚’指定ã—ã¦ãƒ¡ãƒ¢å¸³ã‚’èµ·å‹•ã™ã‚‹
System.Diagnostics.Process.Start("notepad.exe", @"""C:\test\1.txt""");
プãƒã‚»ã‚¹ã®çµ‚了を検知ã™ã‚‹
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)
{
  プãƒã‚»ã‚¹çµ‚了時ã€ã“ã“ãŒå‘¼ã°ã‚Œã‚‹
}