※ ChatGPTを利用し、要約された質問です(原文:Delphi6でVB.NETで作成のDLL呼出)
Delphi6でVB.NETで作成のDLL呼出
このQ&Aのポイント
Delphi6で作成されたEXEからVB.NETで作成されたDLLを呼び出す方法について質問します。
Delphi6のEXEから呼び出した際にエラーが発生しているため、解決策を知りたいです。
DLLの作成方法についてもアドバイスがあれば教えてください。
VisualSutudio2005で作成され提供されているDLLをDelphi6から呼びだしたいと思っています。
提供ファイルとしてあるのは以下のものです。
・DLLファイル本体
・XMLファイル
直接は呼びだせない(?)と思ったので、
VB.NETでDLLを作って間に入れて、
下のように呼び出せばいいのかなと考えています。
Delphi6で作成のEXE → VB.NETで作成のDLL(COM登録?) → 対象のDLL
まずはDelphi6のEXE→VB.NETのDLLの部分を作って試してみたですが
Delphi6のEXEの起動時にエラーとなってしまいます。
「アプリケーションの初期化に失敗しました」
ネットなどで調べてみて作り方は下記のようにしました。
<呼ばれる側:VB.NETのDLL>
1.COMクラスを作る。
・COM参照可能の設定にした。
(タイプライブラリが作成され、レジストリへのCOM登録は自動でされる?)
2.作成したDLLはCドライブ直下に置いた。
※下の*****は自動作成された固定値が入っています。
また見やすくするためここでは半角空白を全角空白に変えています。
--------------------------------------------------------------------
Imports System.Windows.Forms
<ComClass(Middle_Dll.ClassId, Middle_Dll.InterfaceId, Middle_Dll.EventsId)> _
Public Class Middle_Dll
#Region "COM GUID"
' これらの GUID は、このクラスおよびその COM インターフェイスの COM ID を
' 指定します。この値を変更すると、
' 既存のクライアントはクラスにアクセスできなくなります。
Public Const ClassId As String = "**************************"
Public Const InterfaceId As String = "**************************"
Public Const EventsId As String = "**************************"
#End Region
' 作成可能な COM クラスにはパラメータなしの Public Sub New() を指定しなければ
' なりません。これを行わないと、クラスは COM レジストリに登録されず、
' CreateObject 経由で
' 作成できません。
Public Sub New()
MyBase.New()
End Sub
Public Sub DispMsg()
Dim MsgRet As MsgBoxResult
MsgRet = MessageBox.Show("VB.NET DLLより表示!", "確認メッセージ", MessageBoxButtons.YesNo, MessageBoxIcon.Information)
End Sub
End Class
---------------------------------------------------------------------
<呼び出し側:Delphi6のEXE>
1.タイプライブラリの取り込み設定で登録したDLLを選択し、
「コンポーネントラッパーの作成」にチェックを入れてインストールを実行。
---------------------------------------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,OleCtnrs,ComObj, OleServer;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
//----------
//静的呼出
//----------
procedure DispMsg();Stdcall; external 'c:\Middle_Dll.dll' name 'DispMsg';
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
//----------
//静的呼出
//----------
DispMsg();
end;
end.
-----------------------------------------------------------------
Delphi6のEXEはすでにあるものなので、
呼び出し元はDelphi6から変えられませんが、
呼び出し先はC#やC++でも構いません。
(1)Delphi6のEXE→VB.NETのDLLの呼び出しは可能でしょうか?
(2)可能でしたら不具合と思われる箇所はどこでしょうか?
(3)この方法より良いと思われる方法はありますでしょうか?
DLLを作った事がないので見よう見まねで作っています。
気になる点やアドバイス程度でも構いませんので、
どうかよろしくお願いいたします。
== 開発環境 ==
WindowsXP SP3
Delphi6 Enterprise SP2
VisualSutudio2005 ProffesionalEdition 評価版
.NET Framework 1.1~3.5
お礼
ご回答ありがとうございます! 英語サイトのようですが、 翻訳してみて試してみたいと思います。