Visual studio 2008(以下VS2008と略す) を使ってMagic edeveloper V10(以下Magicと略す) のcalldll関数で呼び出せるdllを作る実験をしてみました。

はじめに
私はVS2008ではC#をよく使っています。はじめ、普通に.NET用のDLLを作成してみましたが、残念ながらMAGICからは呼び出せませでした。(だれか.NETで作ったDLLをMAGICから呼び出す方法を知っている人がいたら教えてください。)
とっとと.NETはあきらめて、c++で作ることにしました。しかし、ネット上にMAGIC関係の情報の少ないこと;;

しかたないので、あれこれ試して、うまくいった方法をご報告しますw

  1. Visual Studio 2008の C++ DLLプロジェクトの作成
    新しいプロジェクト作成で 「他の言語」の「Visual C++」の「Win32」の「WIN32プロジェクト」を選択
    プロジェクト名をtestdllと入力しOKボタンを押す
    WIN32アプリケーションウィザードの画面が現れる
      アプリケーションの設定
         アプリケーションの種類: DLLにチェック
         共通ヘッダファイルを追加: すべてにチェックなし
         追加のオプション: すべにチェックなし(プリコンパイル済みヘッダーは無効状態でチェックあり)
    完了ボタンを押す。
     
    作成されるファイルは以下のとおりです。
    (ソース)dllmain.cpp , stdafx.cpp , testdll.cpp
    (ヘッダ)stdafx.h , targetver.h
     
  2. testdll.cppを以下のように編集
    —————————————————————
    // testdll.cpp : DLL アプリケーション用にエクスポートされる関数を定義します。
    //
    #include “stdafx.h”
    //単純な足し算の関数
    int tasizan(int a, int b)
    {
     return a+b;
    }
    ————————————————————–
      
  3. DEFファイルの追加
    関数名の公開のためにに手動でDEFファイルを作成します。
     ソルーションエクスプローラのtestdllの上で右クリック-追加-新しい項目
     モジュール定義ファイル(.def)を選択して、ファイル名にtestdllと入力し追加ボタンを押す。testdll.defを編集して以下のようにする
    ————————————————————–
    LIBRARY “testdll”
    EXPORTS
    tasizan @1
    ————————————————————–
     
  4. ソルーションのビルド
    メニューバーの[ビルド]-[ソルーションのビルド(f6)]を選びビルドします。
    これで DLLの完成です。
     
  5. 配布
    作成されたtestdll.dllをMAGICのWorkingDirと同じフォルダにコピーします。
     
  6. Magicからの呼び出し方法
    C=A+B のようにしたいので、
    変数 をA,B,Cを数字5桁ぐらいで作成します。それからボタンをひとつ用意します。
    ボタンを押されたときに以下の更新が実行されるようにします。
        項目更新  V=項目 C  CALLDLL(’testdll.tasizan’,’444′,A,B)
    これで、Cに足し算の結果が格納されるはずですw
    めでたし めでたし
     
  7. 愕然 orz
    普通のdllが作れるようになったのでこれで面倒なUDFとかUDPとはおさらばよって思っていたのだが、なんと普通のDLLでは引数になっている変数の値ををDLL側で変更するってのができないみたい;;
    CALLDLLのHELPに  「パラメータで結果を受け取る関数を実行しても、結果を受けることはできません。」
    って書いてあるのはそういう意味なのね・・・(涙)
    これでは、本当に必要なDLLがつくれねーーー!!!!!!!!!!!!!!!!!!!!!!!
    次回は、UDP、UDFの作成に挑戦します;; 
     
  8.  [メ モ]
    DLLを作成する方法には、__declspec(dllexport)を使って、DEFファイルを使用しない方法もありますが、これを使うと公開する関数の名前が変更(修飾という)されて公開してしまいます。
    これはc++の「関数のオーバロード」の解決のためにあるためらしいのですが、公開する関数の名前が意図としないものになり、MAGICのCALLDLL(’testdll.tasizan’、’444′,A,B)では呼び出せなくなってしまいます。よって、DEFファイルを使ったイクスポートの方法をとる必要があります。
    ちなみに、プロジェクトの作成のときに「追加のオプション」の「シンボルのエクスポート」にチェックを入れると、__declspec(dllexport)を使ったひな形を作ってくれます。ですからDEFファイルで関数名をEXPORTする場合は「シンボルのエクスポート」にチェックをいれてはいけません。