VBで作成されたDLLをDelphiで使うには。

解決


みぃ  2012-10-25 06:00:21  No: 43253

はじめまして、こんばんは。
DLLの使い方について教えて頂けないでしょうか。
こちらにあるDLLを使いたいと思っています。
http://hp.vector.co.jp/authors/VA026873/AcadRemocon.dll

それで、VBScriptからですと下記のように使えるようです
http://www.acadremocon.net/acadremocon/help/Version.htm
このように、VBscriptから使えるDLLをDelphiで使うには、
どのようにしたた良いのでしょうか?

DelphiでのDLLの使い方を調べて下記のようにしてみましたが、
[プロシージャエントリポイントVersionがダイナミックリンクライブラリ〜から見つかりませんでした]と表示される状況です。
どなたかよろしくお願いいたします。

uses
  〜中略〜
implementation
{$R *.dfm}
function Version():string; stdcall; external 'AcadRemocon.dll';

procedure TForm1.FormCreate(Sender: TObject);
begin
  Showmessage(Version());
end;
end.

環境:Delphi2010


Mr.XRAY  2012-10-25 08:12:53  No: 43254

こんにちは.

DLL には,システムに登録しなければ利用できないもの.
パスの通った場所,つまりフォルダにあれば利用できるものなどがあります.
また,中には,タイプライブラリの取り込み等で,
内部の関数類を Delphi のコードにできることもあります.

その DLL はどうなっているのてしょう.

それと,Delphi のバージョンと Windows のバージョンはなんでしょう.
64 bit のWindows では,動作しないものがあります.これは内部の変数の種類によります.
これも DLL の説明にあるかも知れませんね.

レスする人が調べろ,っていうのはなしにしましょうね.
まず,使う人が「モノ」の正体をしらないと,最近あった事件のようなことに
なるかもしれませんよ〜(笑)

ん ? もしかしたら,私が知らないだけて有名な DLL だったらゴメンなさい.
「無知は最大の武器」ですから.


KHE00221  2012-10-25 08:37:33  No: 43255

CreateObject のやつは ActiveX だろ

http://www.acadremocon.net/acadremocon/Readme.txt

にも ActiveX と書いてあるぞ

登録して取り込め


みぃ  2012-10-25 08:39:48  No: 43256

Mr.XRAYさん

こんばんは、ありがとうございます。
随分と情報不足でした、すみません。

◆DLLに関する情報
  ・regsvr32.exeを使って自分で登録するタイプです。
  ・VBScriptでは下記のコードで動かせるようです。
      Call Main
      Sub Main()
        Set Acad=CreateObject("AcadRemocon.Body") 
      If Not Acad.CheckVersion("110") Then Exit Sub
      End Sub
      出典http://www.acadremocon.net/acadremocon/help/CheckVersion.htm
  ・使えるコマンド一覧
    http://www.acadremocon.net/acadremocon/help/commands.htm

◆環境について
  開発環境はDelphi2010 Windows7 64bitですが、
  当DLLが32bit時代からあるものなので、
  コンパイルしたものの動作確認をXp(32bit)で行っています。

さて、上記のコマンド一覧の中の詳細を色々見ていて、
VBScriptでは「CreateObject」とやっているので、Delphiでも同様な事が必要かと
思うのですが、ではどういう種類の変数にして宣言すべきなのかが、
見つけられない状況です。
何かちょっとしたとっかかりでも見つかれば良いのですが…

また御時間あるときにでもアドバイス頂けると助かります。
どうぞよろしくお願いいたします。


みぃ  2012-10-25 08:42:13  No: 43257

KHE00221さん

ありがとうございます。
ActiveX、調べてみます。


みぃ  2012-10-25 20:20:46  No: 43258

ActiveX DLL Delphi 辺りで調べて、ようやく使えるようになりました。
ありがとうございました。

当初、Win7(64)でコンパイルしXP(32)で動作確認をしてたのですが、
コマンド実行しても全く返答なく悩んでおりました。
試しにXP(32)でコンパイルしたところ動いてくれました。
XP(32)でコンパイルしたものはWin7(64)でも動いてくれました。

まだまだ分かってないことが多すぎですが、
とても楽しいです。

Mr.XRAYさん、KHE00221さん
この度は助かりました、ありがとうございました。


みぃ  2012-10-25 20:21:11  No: 43259

解決です。


Mr.XRAY  2012-10-25 21:56:13  No: 43260

こんちには,

>また御時間あるときにでもアドバイス頂けると助かります。
>どうぞよろしくお願いいたします。

お願いされたのでアドバイスします(笑)
ここはサポートセンターではありません.
お互いに助け合う場所です.
解決したら,後でこの掲示板を利用する方のためにもサマリーを書きましょう.
また,質問の時は,環境を書きましょう.
これも重要な情報です.環境によっては,コンパイル時,あるいは実行時に期待する
動作をしない場合があります.
これはウソではありません.本当です.だから環境が重要なのです.
訊かれてから書く,情報,状況の「後出し」はいけませんねぇ.

質問された方が書いてないので代わりにやってみました.
確認環境は,Windows XP(SP3) + Delphi XE です.

(1) 提示リンクから AcadRemocon.dll をダウンロード
(2) パスの通ったフォルダに置く
(3) [ファイル名を指定して実行]ダイアログから regsvr32 D:\XRAY\AcadRemocon.dll を実行
    パス名は私の場合
(4) Delphi XE の IDE を起動
(5) メニューの[コンポーネント] [コンポーネントのインポート]から [タイプライブラリの取り込み]
(6) ACad Remote Controller を選択して [次へ]
    ACad Remote Controller がなければ[追加] で DLL を選択
    
    ----  中略  ----
    
(7) 既存のパッケージに追加

参考記事
http://mrxray.on.coocan.jp/Delphi/CompoInstall/TypeLibraryD2009.htm

作業が終了したら,IDE を閉じて,再度起動
コンポーネントはレットの [Active] パレットから TBody をフォームへ配置
TButton を1つ配置
この TButton のクリックイベントを以下のようにする

procedure TForm1.Button1Click(Sender: TObject);
var
  DllVer : OleVariant;
begin
  ShowMessage(Body1.Version);

  DllVer := 100;
  if Body1.CheckVersion(DllVer) then begin
    ShowMessage('True');
  end else begin
    ShowMessage('False');
  end;
end;

私の場合,320 と True が表示されました.
クラス名が単純すぎますね. TACadBody にでもしてくれたらよかったのに...

また,64bit 版の Windows 7 で 32bit 版の DLL をシステムに登録する際,
コマンドラインで,regsvr32 を実行すると,64bit 版の regsvr32 が実行されてしまいます.
32bit 版の regsvr32 は,SysWoW64 にあります.これを実行します.


みぃ  2012-10-26 01:44:34  No: 43261

Mr.XRAY さん、こんにちは。

検索てすぐに見つかってしまったために、
書くまでも無いかと勝手に判断してしまいましたが仰るとおり、
情報として残すべきでした。大変申し訳ありません。

私の場合は結局、
メニューの[コンポーネント] [コンポーネントのインポート]から
「ActiveX コントロールの取り込み」に進んでしまい、
一覧に表示されないために、その方法は諦めていました(^^;)
それで下記のようにして実行しました。

//Uses にComObj追加
{$R *.dfm}
function Version():integer; stdcall;
  external 'AcadRemocon.dll';
procedure TForm1.Button1Click(Sender: TObject);
var
  objAcad : variant;
begin
  objAcad := CreateOleObject('AcadRemocon.Body');
  Showmessage(objAcad.Version);
end;

DLLの追加の仕方を教わったおかげで、
今後は先駆者の方々の無数のDLLを色々使うことが出来そうです。
助かりました。ありがとうございました。

全く何も情報のないレスになって申し訳ないので、せめて(と言っても私がわかるレベルの話ですが)
具体的な「64bit 版の Windows 7 で 32bit 版の DLL をシステムに登録する手順」だけでも残しておきます。

・AcadRemocon.dll を%WINDIR%\SysWOW64\下に配置
・コマンドプロンプトで、
  %WINDIR%\SysWOW64\regsvr32.exe %WINDIR%\SysWOW64\AcadRemocon.dll を実行

この度はありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加