マネージ Visual C++ (Visual Studio 2010) で書かれたプロジェクトがあります。.mat形式のファイルの作成をサポートするために、2 つのライブラリ "libmat.dll" と "libmx.dll" を、対応するヘッダー "mat.h" と "matrix.h" と共に使用します。Matlab をインストールすると、これらのライブラリは Matlab ディレクトリにあります (私は Matlab R2010a を使用しています)。
例:
/* content of mat.h */
...
typedef struct MatFile_tag MATFile;
typedef MATFile* (*matOpen)(const char *, const char *);
...
private: System::Void matToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
MATFile *pmat;
mxArray *pa2;
double data[2] = {0.0, 0.4};
matOpen openFunc;
HINSTANCE hLib = LoadLibrary(L"libmat.dll"); // not equal to NULL
if (hLib==NULL)
{
//some action;
}
openFunc = (matOpen) GetProcAddress((HMODULE) hLib, "matOpen"); // not equal to NULL
if (openFunc == NULL)
{
FreeLibrary((HMODULE) hLib);
}
HINSTANCE mxLib = LoadLibrary(L"libmx.dll"); // not equal to NULL
if (mxLib==NULL)
{
//some action
}
pmat = openFunc("aaa.mat", "w");
...
}
プロジェクトは正常にコンパイルされますが、実行時にopenFuncコマンドを呼び出すと次のエラーが発生します。
An unhandled exception of type 'System.AccessViolationException' occurred in System.Windows.Forms.dll
Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
また、上記の DLL で動作する同様のプロジェクトを作成しましたが、アンマネージ C++ の場合は正しく動作します。この問題はマネージ C++ にのみ存在するようです。
任意の入力をいただければ幸いです。