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