Visual C++ 6.0(ATL2.0)のActiveX DLLをDelphiから呼び出す
DelphiからVisual C++のルーチンを利用するには、そのルーチンをActiveX DLLのラッパーに包んで利用するのが楽な方法です。ActiveX DLLにはタイプライブラリが含まれているので、そのDLLをシステムに登録(普通Regsvr32を使う)すると「タイプライブラリの取り込み」でDelphiに簡単にタイプライブラリを取り込むことができます。タイプライブラリを取り込んだActiveX DLLは、Delphiのユニットのように扱うことができます。
ステップ1 「プロジェクト/タイプライブラリの取り込み」で目的のActiveX DLLをDelphiのIDEにインストールする。
ステップ2 「インストール」ダイアログが開いたら「OK」ボタンを押す。
ステップ3 このようにタイプライブラリが取り込まれVCLのラッパーが作られる(つまり、Delphiのユニットとして使えるようになる)
ここまで来れば、ActiveX DLLもただのユニットなので、ふつうのクラスのように扱うことができます。
サンプル(Delphi)
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
AXMUTEXLib_TLB, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private 宣言 }
public
{ Public 宣言 }
FMutex: TMutex;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
Locked: WordBool;
begin
FMutex := TMutex.Create(Self);
Locked := FMutex.LockMutex('MyMutex1');
if Locked then
Label1.Caption := 'すでに起動されています。'
else
Label1.Caption := '起動しました。';
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FMutex.Unlock;
end;
end.
サンプル(VC++)
/*****************************************************************************
AxMutex.dll: Mutex Object
Mutex.cpp : CMutex のインプリメンテーション
Copyright (C)2000 by Nakamura,T. All rights reserved.
*****************************************************************************/
#include "stdafx.h"
#include "AxMutex.h"
#include "Mutex.h"
/////////////////////////////////////////////////////////////////////////////
// CMutex
//
// オブジェクトが破棄されるとき
// =============================
HRESULT CMutex::FinalRelease()
{
if (((ULONG)m_hMutex == 0) || ((ULONG)m_hMutex == ERROR_ALREADY_EXISTS))
return S_OK;
if (m_locked)
{
ReleaseMutex(m_hMutex);
CloseHandle(m_hMutex);
}
return S_OK;
}
//
// ロックされているかどうかを返す
// ==============================
STDMETHODIMP CMutex::IsLocked(VARIANT_BOOL *locked)
{
*locked = _variant_t(m_locked);
return S_OK;
}
//
// 待機関数の待ち時間
// ===================
STDMETHODIMP CMutex::get_MiliSeconds(long *pVal)
{
*pVal = m_miliSeconds;
return S_OK;
}
STDMETHODIMP CMutex::put_MiliSeconds(long newVal)
{
m_miliSeconds = newVal;
return S_OK;
}
//
// アンロックする
// ==============
STDMETHODIMP CMutex::UnlockMutex()
{
if (m_locked)
{
ReleaseMutex(m_hMutex);
CloseHandle(m_hMutex);
m_locked = false;
}
return S_OK;
}
STDMETHODIMP CMutex::Unlock()
{
return UnlockMutex();
}
//
// ロックする
// ==========
STDMETHODIMP CMutex::LockMutex(BSTR mutexName, VARIANT_BOOL *result)
{
USES_CONVERSION;
LPTSTR pMutex = OLE2A(mutexName);
// MUTEXオブジェクトを作成
m_hMutex = CreateMutex(NULL, TRUE, pMutex);
*result = _variant_t(false);
m_locked = false;
// オブジェクトが作成できたか
if (m_hMutex == 0)
*result = _variant_t(true); // 失敗
else if ((ULONG)m_hMutex == ERROR_ALREADY_EXISTS)
*result = _variant_t(true); // すでに存在した。
else
{
// ロックを試みる
if (WaitForSingleObject(m_hMutex, m_miliSeconds) != WAIT_OBJECT_0)
*result = _variant_t(true); // 失敗
else
m_locked = true; // 成功
}
return S_OK;
}
サンプル(IDL)
// AxMutex.idl : AxMutex.dll 用の IDL ソース ファイル
//
// このファイルはタイプ ライブラリ (AxMutex.tlb) を作成するために
// タイプ ライブラリ作成ツール MIDL によって処理されます。
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(AF4C44E0-B723-47A9-B134-7B967675E502),
dual,
helpstring("IMutex Interface"),
pointer_default(unique)
]
interface IMutex : IDispatch
{
[id(2), helpstring("メソッド UnlockMutex")] HRESULT UnlockMutex();
[id(3), helpstring("メソッド IsLocked")] HRESULT IsLocked([out, retval]VARIANT_BOOL *locked);
[propget, id(4), helpstring("プロパティ MiliSeconds")] HRESULT MiliSeconds([out, retval] long *pVal);
[propput, id(4), helpstring("プロパティ MiliSeconds")] HRESULT MiliSeconds([in] long newVal);
[id(6), helpstring("メソッド Unlock")] HRESULT Unlock();
[id(7), helpstring("メソッド LockMutex")] HRESULT LockMutex([in]BSTR mutexName, [out, retval]VARIANT_BOOL* result);
};
[
uuid(D6B0038D-DAF1-40F9-B27F-E52ADDBA8FC8),
version(1.0),
helpstring("AxMutex 1.0 タイプ ライブラリ")
]
library AXMUTEXLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[
uuid(B0F297CE-2411-436F-B7D7-05D606145B6E),
helpstring("Mutex Class")
]
coclass Mutex
{
[default] interface IMutex;
};
};