Visual StudioからMFCを使えるプロジェクトを作成してみましょう!
ウイザードから作ってみるとShadeのSDKで何が必要とされているかよくわかります。
1.ウイザードの起動
Visual Studioでファイル->新規作成->プロジェクト->MFC AppWizard(dll) でプロジェクト名
フォルダーはplugin_projectの下をお勧め。MFCはスタティックリンク
2.ファイルの追加
- SourceFileからxxxxx.defを削除します
- プロジェクト->プロジェクトに追加->ファイルで、Shade R4 Plugin\sourceから
plugin.def
com.cpp
assert_.cpp(必要に応じて)
を追加
3.プロジェクトの設定
プロジェクト->プロジェクトの設定で
"全ての構成"を選択、設定の対象を一番上のプロジェクト全体
- C/C++のタブを選択、"一般"(プリプロセッサ-でも可能)の"プリプロセッサ-の定義"に追加
Windows=1,plugin=1,sxdebug=0,STDCALL=__stdcall,DLLEXPORT=__declspec(dllexport),NOMINMAX
の一連の定義を設定します。
/D extern_c="extern \"C\""
この行だけは一番下のコマンドオプションに直接書きこみます。デバッグ、リリース別々の設定に書き込みます。これは厄介なので、私は自前のインクルードファイルに定義しています。
これでexternを除く全ての定義は以下になります。
_DEBUG,WIN32,_WINDOWS,_WINDLL,_MBCS,_USRDLL
,Windows=1,plugin=1,sxdebug=0,STDCALL=__stdcall,DLLEXPORT=__declspec(dllexport),NOMINMAX
R5からはさらに、USE_STL=1 を加えてください。
その他、
camera-> get_target (i);カメラがオブジェクトカメラになったので使用不可
Skip Joint関連の削除(自明)
inihbit_update(),Allow_update()の必要性がなくなった。(allowだけ実行すると問題を起こす)
line->get_number_of_control_points()がなくなりました。shape->get_total_number_of_control_points()を使用します。
- "プリコンパイル済みヘッダー"のカテゴリーでプリコンパイル済みヘッダーを自動的に使用に変更(結構重要です)
- "プリプロセッサー"カテゴリーのインクルードファイルに
.\\,..\..\source
を追加します。最初の.\\は自分の場所にあるStdAfx.hを優先するため、..\..\sourceはShadeSDKのヘッダーファイル位置。
- リンクタブの出力には
C:\Progam Files\Shade R4\Professional\plugins\xxxxx.dll
とすぐにShadeで起動できるようにしています。
4.ソースファイルの変更
- ウイザードで出来上がった,xxxxx.cppファイルの末尾にShadeSDKのコードをくっつけます。
今回SimplePlugin.cppをCopy&Paste
- さらにplugin_component()のコンストラクターに
// Must be declare if you want to access shared MFC DLL
AFX_MANAGE_STATE(AfxGetStaticModuleState());
この行を追加します。
PluginIDや名前を適宜変更
- 次にStdAfx.hの変更をします。
#include <afxole.h> // MFC の OLE クラス
#include <afxodlgs.h> // MFC の OLE ダイアログ クラス
#include <afxdisp.h> // MFC のオートメーション クラス
#include <afxdb.h> // MFC ODBC データベース クラス
#include <afxdao.h> // MFC DAO データベース クラス
#include <afxdtctl.h> // MFC の Internet Explorer 4 コモン コントロール サポート
これらの各行をコメントアウトします。
#ifndef _AFX_NO_OLE_SUPPORT
#ifndef _AFX_NO_DB_SUPPORT
#ifndef _AFX_NO_DAO_SUPPORT
これらの定義をすればよさそうなのですが、他にも影響を与えているのでインクルードを止めておきます。
afxcmn.hはけしてはずさないでください。
以上でMFCの機能をもったプラグインの骨組みができました。
コンパイルして立ち上がるはずです。
5.ダイアログボックスとダイアログクラスの追加
次にダイアログボックスをつくってクラスウイザードを使用し、新しいダイアログクラスを作成して
下記インクルードファイルと
#include "MyDialog.h"
MyDialog dlg; //ダイアログの作成
dlg.DoModal(); //モーダルダイアログを立ち上げ
これでダイアログが立ち上がります。
ここで難問が発生する場合があります。リンクする段階で"DllMainが重複していると"エラーになる場合があります。
(どのような場合なのか不明)
nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12 はすでに LIBCMTD.lib(dllmain.obj) で定義されています
nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) はすでに libcpmtd.lib(delop.obj) で定義されています
これらはどうやらリンクする順番に問題があるようです。
もともとどこにも記述していないDllMainを複数のライブラリーで拾ってしまうのです。
対策としてリンクオブジェクトにStdAfx.objを記述してしまいます。
または、以下のライブラリー明記します。
| MFCスタティックリンク | デバッグ | リリース |
| オブジェクト/ライブラリー | NAFXCWD.LIB LIBCMTD.LIB | NAFXCW.LIB LIBCMT.LIB |
| 無視するオブジェクトライブラリー | LIBCMTD.LIB,LIBCPMTD.LIB | LIBCMT.LIB,LIBCPMT.LIB |
これらはafx.h内でリンカーコマンドとして記述されているものを強制します。
サンプルコード一式
以上
5/22 Tak Okada
2001 6/7 R5用.dsp変更
#