初心者で全然分からないので教えて欲しいのですが、色々出回っているようなVB用のDLLをDelphiで使用する方法はないのでしょうか?宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (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固有の変数型を使用していなければ、この方法ですんなりロードして使えると思います。

 参考になれば幸いです(..
    • good
    • 0

私はDelphi使いではないので試したことは


ありませんが、「About Delphi」のサイトで
Delphi-MLの過去ログを検索してみては
如何でしょうか?

参考URL:http://www2.big.or.jp/~osamu/Delphi/
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVB.NETとACCESSについて

VB.NETを使ってACCESSデータベースに入っているレポート(印刷プレビュー)を呼び出して印刷したいのですが、どうしたらいいかわかりません。VB.NETでデータベースに接続してSQLのinsert文でデータを追加することはできます。その後、VB.NETでデータベースに入っているものを印刷するにはどうしたらいいのでしょうか?ACCESSでレポートは作ってあります。どなたか教えていただけないでしょうか?

Aベストアンサー

VB.NET Access レポート

参考URL:http://www.google.co.jp

QDelphi6で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

VisualSutudio2005で作成され提供されているDLLをDelphi6から呼びだしたいと思っています。
提供ファイルとしてあるのは以下のものです。
・DLLファイル本体
・XMLファイル

直接は呼びだせない(?)と思ったので、
VB.NETでDLLを作って間に入れて、
下のように呼び出せばいいのかなと考えています。

Delphi6で作成のEXE → VB.NETで作成のDLL(COM登録?) → 対象のDLL

まずはDelphi6のEXE→VB.NETのDLLの部分を作って試してみたですが
Delphi6のEXEの起動時にエラーとなってしまいます。
「アプリケーションの...続きを読む

Aベストアンサー

ここが参考になると思います。

Using a .NET Assembly via COM by Jim McKeeth
http://dn.embarcadero.com/article/32754

QACCESS2003 VBAよりVB.NETを使った方がいい?

ACCESS2003 VBAよりVB.NETを使った方がいい?

プログラマーでもないのですが、仕事でAccess2003でVBAを書いています。フォームにテーブルから引っ張てきたデータを表示させてデータを閲覧したり、データを加工してExcelにデータを吐き出したりしています。テーブルには10万件程度のデータがあります。

特に私は便利に使っているのですが、上司がVB.netとMYSQLでプログラム書いた方が楽じゃない?VB.NETよかったら買ってあげるよと言われました。買ってくれるのは嬉しいのですが、.netなんてやったこともないですし、DAOしか使ったことがなくADOなんて全くわかりません。

何かACCESS VBAよりVB.net+MYSQLのメリットって何かありますでしょうか?ちなみに業務で使うためのものなので、家からアクセスして何かするというのは考えていません。あくまで社内で使う時にメリットはあるでしょうか?

Aベストアンサー

VBA(VB6系)とVB.NETは全く異質の言語です。
VBAでやれているなら、無理に.NETを導入する
理由はありません。
>VB.netとMYSQLでプログラム書いた方が楽じゃない?
そんなことはありませんよ。プログラムする
という作業に変わりありませんし、SQLを構築
するのに、クエリビルダのようなツールも
ありません。社内で使うんでしたら、VBAを
薦めます。

QC++.NETで作ったDLLをVB6で使用するには

Visual Studio .NET のC++で作られたDLLをVisual 
Basic 6.0 で使用することはできますか。
 
 

Aベストアンサー

クラスを公開したMFC DLL以外は使用可能です。


どんなDLLを作りましたか?
それによって使い方や制限が変わってきます。

Qaccess → Oracleへのデータ移行(VB.NETで)

お知恵を貸してください。

ただ今、VB.NETでアクセスで開発されたアプリケーションを、
VB.NETに移行する開発をしているのですが、その中で、
現在のDBはアクセス、移行後のDBはオラクル10gなんですが、
何か良い移行方法は無いでしょうか?
ちなみに、テーブル名、レコード名は変更しますので、そのまま移行ではありません。

私が考えているのは、アクセスのデータをエクセルにコピペし、
それを.NETで読み込んでテープルに入れて1レコードずつ
オラクルに書き込んで行こうと考えております。

しかし、上記の方法でエクセルの読込方法が良く分かりません。
一旦、エクセルに取込む方法の場合の読込方法を教えてください。

また、もっと効率の良い方法をご存知でしたら教えてください。

開発環境は 
OS : windows XP Pro
開発ソフト : VB.NET
DB : Access 2003 SP2
DB : Oracle 10g
です。なにぶん、VBでの開発経験が浅いので、
猿でも分かるように(W)お教えいただけると幸いです。

お知恵を貸してください。

ただ今、VB.NETでアクセスで開発されたアプリケーションを、
VB.NETに移行する開発をしているのですが、その中で、
現在のDBはアクセス、移行後のDBはオラクル10gなんですが、
何か良い移行方法は無いでしょうか?
ちなみに、テーブル名、レコード名は変更しますので、そのまま移行ではありません。

私が考えているのは、アクセスのデータをエクセルにコピペし、
それを.NETで読み込んでテープルに入れて1レコードずつ
オラクルに書き込んで行こうと考えております。

し...続きを読む

Aベストアンサー

テーブル名やレコード名(カラムIDの間違い?)が変更になるのであれば、
移行元のアクセスVBAで移行先のORACLEDBをオープンして、対応するテーブル・カラムにデータを入れるようにするのがいいんじゃないでしょうか。
わざわざ.NETにしなくてもEXCELにしなくてもAccess VBAで十分でしょう。
※とかいいながら、私はVB.NETで作ったので、こんな感じです。
------------------------------------------------------------
Imports System.Data
Imports System.Data.OleDb
Imports System.Data.OracleClient
Public in_conn As OleDbConnection '-- Accessコネクション
Public out_conn As OracleConnection '-- ORACLEコネクション
Dim accessDBProvider As String
accessDBProvider = "Provider=Microsoft.Jet.OLEDB.4.0;Data source=なにか"
in_conn = New OleDbConnection(accessDBProvider)
in_conn.Open()
out_conn = New OracleConnection("Data Source=TNS名;USER ID=ユーザID;PASSWORD=パスワード")
out_conn.Open()
-----------------------------------------------------------
これで、AccessとOracleが同時に開けているので、あとはin_conn側からデータを読み込んで、out_conn側でデータを出力するようにします。
カラム数が変わらず、カラムの順序もタイプも変わらないのなら、単純に読み込んだものを出力するだけです。
-------------------------------------------------------------
Dim myDataSet As DataSet
Dim myOraCommand As OracleCommand
Dim myOraDataAdpt As OracleDataAdapter
Dim myCommand As OleDbDataAdapter
Dim myTable As DataTable
Dim myRow As DataRow
sql = "SELECT * FROM ACCESS_TBL"
myCommand = New OleDbDataAdapter(sql, in_conn)
myDataSet = New DataSet
myCommand.Fill(myDataSet)
sql = "SELECT * FROM ORACLE_TBL" '-- 0件のデータを読むことになるけど、テーブル構造が欲しいので取得する
myOraCommand = New OracleDataAdapter(sql, out_conn)
myOraCommand.Update(myDataSet)
--------------------------------------------------------------
私のは完全に我流なので、きれいじゃないけど、こんな感じにしました。
もし、ご参考になるのであれば。

テーブル名やレコード名(カラムIDの間違い?)が変更になるのであれば、
移行元のアクセスVBAで移行先のORACLEDBをオープンして、対応するテーブル・カラムにデータを入れるようにするのがいいんじゃないでしょうか。
わざわざ.NETにしなくてもEXCELにしなくてもAccess VBAで十分でしょう。
※とかいいながら、私はVB.NETで作ったので、こんな感じです。
------------------------------------------------------------
Imports System.Data
Imports System.Data.OleDb
Imports System.Data.OracleClient
Pu...続きを読む

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

こんにちは、honiyonです。

 複数アプリケーションからそれぞれコールバック関数を登録してもらい、状況に応じてそれぞれのコールバック関数を呼び出す、というDLLを作成しています。

 しかし現在、呼び出しアプリケーションごとにメモリ空間が独立してしまい、コールバック情報を同一空間内で管理出来ずに困っています。

 旧VerのDelphiで16bit DLLなら、interface部に定義した変数、オブジェクトはDLL内で同一空間内で共有出来るようですが、これをDelphi6 32bitDLLで行う事は不可能でしょうか? もしくは、その他の方法で独立メモリ空間を作らないようにする方法はありますでしょうか?

 不可能な場合、CreateFileMappingが次に有効な手段として候補に挙がると思います。CreateFileMappingで管理クラスのポインタを渡してクラス共有というのは現実的な手法でしょうか?

 よろしくお願いいます(..

Aベストアンサー

Delphiは無知なので一般的な意見です。

メモリマップドファイル(共有メモリ)は現実的だと思います。特に16->32bit移行時には良く使われた手法ではないかと思います。

片やDLLの共有領域はVC++等では共有セグメントを指定すれば可能ですが、Delphi(特にLinker)でどのような扱いになるのか???

Win32の寿命、その他から、個人的には共有メモリを推します。

QVB.NETからAccess内のデータベースに列を挿入する方法について

VB.NETからAccess内のデータベースに列を挿入する方法について
御存知の方がおられましたらご享受ください。m(_"_)m

Aベストアンサー

テーブル変更の【ALTER TABLE】をSQLで流してみてはどうでしょうか?
テーブル変更のSQL文については、以下のサイトが参考になると思います。

http://www.techscore.com/tech/sql/03_02.html

ソースはこんな感じかな?
※実行をして確認はしていません

Dim Conn As New SqlConnection
Dim Cmd As SqlCommand

'DBオープン
Conn.ConnectionString = "コネクション文字列"
Conn.Open()

'SQL実行
Cmd = New SqlCommand("テーブル変更のSQL文", Conn)
Cmd.ExecuteNonQuery()

'DBクローズ
Conn.Close()

Q秀丸の正規表現用DLLをDelphiから使いたい

秀丸に同梱されている正規表現処理用DLL、HMJRE.DLLをDelphiで使用しようとしているのですが、
うまくいきません。
実行しようとすると「エントリーポイントが見つかりません」と表示されます。
----------------------
function dllfuncstr(func:String;find_str:String;target_str:String;start_pos:Integer;replace_str:String;kind:Integer):String; external 'HMJRE.DLL';
...

procedure TForm1.Button1Click(Sender: TObject);
var
find_str, target_str, replace_str:String;
start_pos, kind:Integer;

begin
find_str := '123';
target_str := Memo1.Lines[0];
start_pos := 0;
replace_str := 'abc';
kind := 1;//

Memo2.Lines[0]:= dllfuncstr('ReplaceRegularNoCaseSence',find_str,target_str,start_pos,replace_str,1);

end;
-----

秀丸のヘルプにマクロから呼び出す場合の例 が次のように記載されています。
$s = dllfuncstr( "ReplaceRegular", "([a-z]+)([0-9]+)", "--abcdefg1234567--", 0, "\\2\\1" );
message $s;

DelphiのバージョンはXE5です。

秀丸に同梱されている正規表現処理用DLL、HMJRE.DLLをDelphiで使用しようとしているのですが、
うまくいきません。
実行しようとすると「エントリーポイントが見つかりません」と表示されます。
----------------------
function dllfuncstr(func:String;find_str:String;target_str:String;start_pos:Integer;replace_str:String;kind:Integer):String; external 'HMJRE.DLL';
...

procedure TForm1.Button1Click(Sender: TObject);
var
find_str, target_str, replace_str:String;
start_pos, kind:Integ...続きを読む

Aベストアンサー

>実行しようとすると「エントリーポイントが見つかりません」と表示されます。

HMJRE.DLLにdllfuncstr()でエクポートされているエントリはありませんから当然でしょうね。

>秀丸のヘルプにマクロから呼び出す場合の例 が次のように記載されています。

秀丸のマクロの機能としてdllfuncstr()があるのであって、HMJRE.DLLにdllfuncstr()があるわけではありません。
「Delphi DLL 使い方」辺りで検索してみましょう。

手元にDelphi環境があるワケではないので未確認にはなりますが…

function ReplaceRegularNoCaseSence(ReplaceRegular:String, Pattern:String, index:Integer, Replace:String, Action:Integer): String; stdcall; external 'HMJRE.DLL' name 'ReplaceRegularNoCaseSence';

ってな感じになるかと。

QVB.NETからAccessの操作

現在VB.NETで開発をしています。
実はVB.NETから、指定してあるアクセスファイルのテーブルをコピーして名前をかえたいと思っています。
どのようにすればよいのでしょうか。教えてください。

Aベストアンサー

すみません、勘違いしていました。
accessObj.DoCmd.rename("newName", 0, "oldName")
の部分を
DoCmd.CopyObject , "newName", 0, "oldName"
として下さい。
新しく名前をつけてコピーします

QDelphi で作成中 DLL の中で ProcessMessages を行うには?

ソケット通信を行うDLLをDelphiで作っています。クライアント側になるので、まずは普通のフォームで作成し、動作を確認したのでフォームを除去してDLLに移行しています。

TClientSocket を利用しているので、たとえば通信終了時の OnSocketDisconnect 等、ソケット通信に関連するイベントに応答しなければならないのですが、DLLとして外部からコールされるとき、イベントをどのように待ったらよいのか分かりません。

Application.ProcessMessages が使えれば、それで何とかなりそうなのですが、他の手段はあるでしょうか。

もしくは、TClientSocket 等のコンポーネント以外の方法でソケット通信を実現すれば良いのかも知れませんが、どのような方法があるのか分かりません。

何かアドバイスをいただければ幸いです。

Aベストアンサー

え~っと、、TClientSocket、他、Network系のことって、全然分からないんで、何がどうなっているのか知りませんが、、

uses に Forms を追加してやれば、
  Applicaton.ProcessMessages
は、一応、出来ますよ。
まぁ、ムダなユニットを追加するのも嫌な感じですけど、、


人気Q&Aランキング

おすすめ情報