CallDLL

 

外部DLL のCDECL規約関数の呼び出し

Magic xpaからCDECL呼び出し規約でDLLを呼び出します。

構文:

CallDLL(モジュール名.関数名,引数型文字列,パラメータ1 ,パラメータ2 ,.)

パラメータ:

  • モジュール名.関数名 …… DLL のモジュール名と使用する関数名

  • 引数型文字列 …… 一つ一つの文字がパラメータタイプを意味する文字列
    最後の一文字が関数の戻り値の型を意味します。

  • パラメータ …… DLL への引数

戻り値:

DLL 内の指定した関数が返す値

戻り値だけは、Magic xpaに返されます。送られる項目に対する修正内容は、Magic xpaniには反映されません。

例:

CallDLL('mydll.lmath','1L44',A,B,C)

 

対応するC関数は、long lmath(char action, long *a, long b)となり、DLL内の関数であるlmath からの戻り値が返ります。

 

CallDLL('mydll.add_str','AAA',A,B)

 

対応するC関数はchar *add_str(char *a, char *b)となり、DLL内の関数のadd_str からの戻り値が返ります。

注意事項:

  • 多くのDLLは、ウインドウの「ハンドル値」を必要とします。これは、既存のウインドウごとの識別番号です。WinHWND()関数を使用することで、CallDLLにこの値を簡単に指定することができます。この関数は世代番号というパラメータを指定します。現在のタスクのウインドウのハンドル値を取得する場合は、常にWinHWND(0)を実行するだけです。

  • DLL関数が複雑な構造体を受けとることを期待しているのであれば、.NETコードを呼びだす方がより簡単です。たとえば、項目A を CallDLL('mydll.myfunc','AA',B)  で更新する(A と B は文字型項目)代わりに、文字列バッファ(BStr)を受け取ったり返す関数をを考えます。以下のように、[コール.NET]処理コマンドでAを戻り値、Bをパラメータとすることができます。

using System;

using System.Runtime.InteropServices;

public static class Snippet

{

    public static System.String func(ref System.String input)

   {

      return myfunc(input);          

    }

    [DllImport("mydll.dll", CharSet = CharSet.Auto)]

    [return: MarshalAs(UnmanagedType.BStr)]

    public static extern string myfunc([MarshalAs(UnmanagedType.BStr)] string Interface);

}

  • パラメータとして文字データを直接指定した場合、[動作環境]の[外部コードページ]で指定されたコードページに基づいて値がエンコードされます。このようなプログラムを使用する場合は、CodePage関数でコードページを「932」に設定するか、文字型変数項目を指定するか、UnicodeToANSI関数で変換する必要があります。