DLLが見つからないとき
結局、マネージDLL不在チェックの方法がない(今のところ見つけられない)ので、アンマネージDLLだけをLoadLibraryで明示的リンクしてエラーチェックしても仕方がないような気がします。
(2008.09 マネージDLLの動的リンクを見つけました>
こちら )
マネージアプリから、マネージDLLとアンマネージDLLを呼んでみる
マネージDLLは、プロジェクトプロパティで参照設定しておき、using namespace ...で呼べるようにしています。アンマネージDLLは、インポートライブラリを使用して、暗黙的リンクで使用しています。
マネージDLL(ManagedDLL.dll)が見つからないときは、以下のダイアログが出ます。なんのエラーが発生したのか不明な、意味のないダイアログです。
アンマネージDLL(UnmanagedDLL.dll)が見つからないときは、以下のダイアログが出ます。しかも、古いウィンドウ形式のダイアログが(笑
どちらも見つからないときは、アンマネージDLLのダイアログが出ます。
Test.cpp
using namespace System;
using namespace ManagedDLL;
#include "UnmanagedDLL.h"
int main(array<System::String ^> ^args) {
Console::WriteLine("Manamged Add(1,2) = "+ManagedDLL::Lib::Add(1,2) );
Console::WriteLine("Unmanaged Sub(1,2) = "+ Sub(1,2) );
Console::ReadLine();
return 0;
}
ManagedDLL.h
#pragma once
namespace ManagedDLL {
public ref class Lib {
public: static int Add(int a, int b) {
return a+b;
}
};
}
ManagedDLL.cpp
#include "ManagedDLL.h"
#ifndef __UnmanagedDLL_h
#define __UnmanagedDLL_h
UnmanagedDLL.h
#ifdef DLL_EXPORTS
#define _EXPORT __declspec(dllexport)
#else
#define _EXPORT __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C" {
#endif
_EXPORT int __stdcall Sub(int a, int b);
#ifdef __cplusplus
}
#endif
#endif // #ifndef __UnmanagedDLL_h
UnmanagedDLL.cpp
#include "windows.h"
#define DLL_EXPORTS
#include "UnmanagedDLL.h"
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved) {
return TRUE;
}
_EXPORT int __stdcall Sub(int a, int b) {
return a - b;
}
マネージアプリからマネージDLL(内部でアンマネージDLL呼んでいる)を呼んでみる
マネージDLLは、プロジェクトプロパティで参照設定しておき、using namespace ...で呼べるようにしています。マネージDLLから呼んでいるアンマネージDLLは、インポートライブラリを使用して、暗黙的リンクで使用しています。
このパターンは、既存のライブラリをマネージコードで(特にC#/VBで)使用するための、もっとも多いパターンではないかと思われます。いまだにVC6のDLLしか用意されていないものも多数あり、それらを使用するためのラッパーとしての位置付けです。
マネージDLL(ManagedDLL.dll)が見つからないときは、以下のダイアログが出ます。なんのエラーが発生したのか不明な、意味のないダイアログです。アンマネージDLL(UnmanagedDLL.dll)が見つからないときも、同じダイアログが出ます。
Test.cpp
using namespace System;
using namespace ManagedDLL;
int main(array<System::String ^> ^args) {
Console::WriteLine("Manamged Add(3,1) = " + ManagedDLL::Lib::Add(3,1) );
Console::WriteLine("Manamged Sub(3,1) = " + ManagedDLL::Lib::Sub(3,1) );
Console::ReadLine();
return 0;
}
ManagedDLL.h
#pragma once
#include "UnmanagedDLL.h"
namespace ManagedDLL {
public ref class Lib {
public: static int Add(int a, int b) {
return a+b;
}
public: static int Sub(int a, int b) {
return ::Sub(a,b);
}
};
}
ManagedDLL.cpp
#include "ManagedDLL.h"
UnmanagedDLL.h
#ifdef DLL_EXPORTS
#define _EXPORT __declspec(dllexport)
#else
#define _EXPORT __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C" {
#endif
_EXPORT int __stdcall Sub(int a, int b);
#ifdef __cplusplus
}
#endif
#endif // #ifndef __UnmanagedDLL_h
UnmanagedDLL.cpp
#include "windows.h"
#define DLL_EXPORTS
#include "UnmanagedDLL.h"
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved) {
return TRUE;
}
_EXPORT int __stdcall Sub(int a, int b) {
return a - b;
}
最終更新:2008年10月06日 21:44