DLLをいぢって見る



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