• 締切済み

DelphiでVB用のDLLを使えないでしょうか?

honiyonの回答

  • honiyon
  • ベストアンサー率37% (331/872)
回答No.2

こんにちは、honiyonです。  大分前に質問されてますがもう解決されているのかな?(^^;  何となく見つけてしまったので回答してみたりします。  Delphi風に宣言するなら、以下のようになります。  function MessageBox(HWnd: Integer; Text, Caption: PChar; Flags:   Integer): Integer; stdcall; external 'user32.dll' name 'MessageBoxA';  これは、Windowsの MessageBox関数(API)を読み込んだ例です。  MessaeBox関数の宣言をして、  external [ロード元のDLL] name [ロード元の関数名];  です。 stdcall; は呼びだし規約指定です。 大抵(というか標準)では stdcall;です。  この方法を用いて宣言すると、実行時にDLLが自動的にロードされます。   もし必要なタイミングで読み込みたい場合は、LodLibraryや、GetProcAddressを使って下さい。 使い方はWin32APIと一緒なので、詳しくはWin32APIのヘルプを参照してください。  以上が DLLのロード方法です。 基本的に開発言語が何であろうが「DLL」という規則に沿ったものならロード可能です。 ただし、その言語に依存する形式の変数などを使われると厄介です。 たとえば、Delphiでいうとstring型ですね。 これは Delphi固有の変数です。 他の言語からでもロード出来るようにしたければ PCHAR型を使う事になります。  その VBで作った DLLが、VB固有の変数型を使用していなければ、この方法ですんなりロードして使えると思います。  参考になれば幸いです(..

関連するQ&A

  • Delphiでyacscom.dllを使いたい

    Delphi6を使用してType Libより、Yahoo! Audio Conferencing(yacscom.dll)を使用してみようと思ったのですが、エラーになってしまいます。 タイプライブラリからのYACSCOMLib_TLB.pas書き出しはメニューから実行し完了します。それをパッケージに登録も問題はありません。 新規アプリを開き、追加したコンポーネントTYAcsをフォームに置こうとすると「インターフェイスがサポートされていません.」と表示されてしまいます。 同じコンポーネントをVB6で使おうとした場合は、フォームに貼り付けでき使えそうです。 ちなみに、Delphi2010でも確認しましたが、同じ結果です。 yacscom.dllは、ヤフーメッセンジャーV7インストール時に導入されるものを対象で考えています。 Delphiで使えるようにできる方法があれば知りたいと思い、ここに書き込みさせていただきました。判られる方が居られましたら、よろしくお願いします。

  • Delphi6でVB.NETで作成の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

  • VB2008でのDLL作成方法について

    はじめまして、はじめて投稿します。 初心者なので変な質問をしていたらすいません。VB2008を使用しています。 VBで作成したDLLファイルをLabviewで使用したいと思っています。 ただVB6.0でActiveX DLLを作成する方法はわかるのですが、VB2008で作成する方法がわかりません。 クラスライブラリでプログラムを作成し、DLLにすることはできるのです・ しかしレジストリに登録しようと思い「regsvr32 ファイルのパス**.dll」と入力したところ「**.dllは読み込まれましたが、DllRegisterServerエントリポイントが見つかりませんでした」と出ます。 調べてもVB2008でのActiveX DLL作成方法が見つからなくて困っています!!! わかるかた、よろしくお願いいたします。

  • Delphiの環境について

    Delphi初心者です。 現行VBVersion5で構築したシステムが動作するPC上にDelphi (バージョンは未だ決まってません) でシステムを構築しようと考えていますが、この2つのシステムの 共存は可能なのでしょうか? (VB同士でバージョンが異なるとDLLとかの問題がありますが、Delphiでは  それと似たような制限とか問題はあるのでしょうか?) なに分初心者なので、おかしな質問かも知れませんが、よろしくお願い します。

  • DLL作成について

    Delphi6とVisualstdio.Net2003を持っています。Excelから使用するDLLを作成したいのですがどちらがいいか迷っています。(ソフト作成は久しぶりです).NetがかつてのVBのようにランタイムが必要ならばDelphiの方がいいかなと思っています。.NetでDLLを作成した場合ランタイム等は必要なのでしょうか?(Windows98の場合も含め)よろしくお願いいたします。

  • DelphiのDLLのサイズについて

    DelphiプログラムをDLL化しています。 元のプログラムのサイズが10Mですが、このプログラムの一部(行数にして全体の1/7ほど)をDLL化すると、4Mにもなります。 こんなものでしょうか?

  • VB.NETがDelphiより有利な点は

    VB.NETとDelphiを比較して互いに有利不利な点を教えてください。 また、VB.NetはDelphiより速いですか?

  • C++ のDLLがdelphiで読めない

    VisualStudio2010C++で作ったDLLをdelphiで利用したいのですが、「エントリポイントが 見つかりません」といわれてしまいます。チュートリアルのサンプルそのままで試して見ましたが、VS2010 付属のdumpbin .exe でdllの中身を見るとエントリポイントが @ILT+345?Add@MyMathFuncs@MathFuncs@@QAGNNN@Z)みたいな、元の関数名はどうした? と思えるような名前です。 defファイルを使って見ましたが、今度は 1 0 0001115E Add = @ILT+345(?Add@MyMathFuncs@MathFuncs@@QAGNNN@Z) みたいな表示でやはりdelphiから読めません。__stdcall にはしています。 VC++で読み込めばちゃんと読めるのである意味正しく作られているのだと思いますが、他のOpenNI , OpenGL などのdllをdumpbin /exports で覗くと、整然と関数名が並び、 これなら読めるだろうと思えますし、実際にdelphiでも使えます。 他の言語ですっきり関数名で呼び出せる(普通の)DLLを作るにはどうすれば良いのでしょうか。 VisualStudioで作ったDLLは呼ぶ側があの記号のような名前で呼べということなのでしょうか?

  • C#で作成したDLLをDelphiで呼ぶ方法

    プログラミング初心者です。 以下の内容について、どなたか教えてください。 Visual studio 2010(C#のフォームアプリケーション)とCOM(ActiveX Tool bar)で作成されたフォームをDelphiで呼び出すことは可能でしょうか。 上記の内容を試験的に作成し(Visual studio 2010C#のフォームにCOMから参照したToolbarを貼り付けた物)、プロジェクトの出力方式をクラスライブラリに変更して、DLLの作成までは行えました。しかし、その先のDelphiからの呼び出し方がわかりません。 上記のDLLを用いてDelphiから呼び出す方法をご存知の方がいれば、教えてください。 なお現在の開発環境は以下の通りです。 Visual Studio 2010(C#) Delphi XE2(Trial) ご教授のほど、よろしくお願い致します。

  • Delphi6 DLL内でのメモリ共有(?)

    こんにちは、honiyonです。  複数アプリケーションからそれぞれコールバック関数を登録してもらい、状況に応じてそれぞれのコールバック関数を呼び出す、というDLLを作成しています。  しかし現在、呼び出しアプリケーションごとにメモリ空間が独立してしまい、コールバック情報を同一空間内で管理出来ずに困っています。  旧VerのDelphiで16bit DLLなら、interface部に定義した変数、オブジェクトはDLL内で同一空間内で共有出来るようですが、これをDelphi6 32bitDLLで行う事は不可能でしょうか? もしくは、その他の方法で独立メモリ空間を作らないようにする方法はありますでしょうか?  不可能な場合、CreateFileMappingが次に有効な手段として候補に挙がると思います。CreateFileMappingで管理クラスのポインタを渡してクラス共有というのは現実的な手法でしょうか?  よろしくお願いいます(..