- 締切済み
VB.NETでDLL関数を呼び出すには
VB.NETでDLLの関数を呼び出す時に、 NewではなくCreateObject()を使って呼び出すには、 どのように記述をすればよいのでしょうか。 具体的には、 ソリューション名 ClassLibrary1で ---------------------------------- Imports System.Windows.Forms Public Class Class1 Public Sub test() MessageBox.Show("テスト") End Sub End Class ---------------------------------- のコードをビルドしてClassLibrary1.dllを生成して、 ソリューション名 ConsoleApp1で ---------------------------------- Imports ClassLibrary1 Module Module1 Sub Main() Dim obj As Class1 obj = New Class1() 'obj = CreateObject("Class1") obj.test() End Sub End Module ---------------------------------- のコードをビルドして実行すると、 正しく実行できますが、 obj = New Class1() を obj = CreateObject("Class1") のようにすると図のようなエラーになります。 Newではなく、CreateObject()を使ってDLLを呼び出すには、 どのように記述をすればよいのでしょうか。 よろしくお願いします。 (Windows10)(Visual Studio 2022)
- ID_20150222
- お礼率91% (305/332)
- Visual Basic
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- wormhole
- ベストアンサー率28% (1619/5654)
詳しくは知らないので参考程度に。 CreateObject()で生成できるのはCOMオブジェクトです。 VB.NETやC#でふつうにつくるDLLはCOMオブジェクトではないので、 COMオブジェクトなDLLを作るようにしてください。
関連するQ&A
- VB.NETのデリゲートについて
VB.NETのデリゲートについて質問です。 以下のプログラムなのですが、 デリゲート型をインスタンス化しているところで、コンストラクタにパラメータを渡していますが、 そのコンストラクタはどこに定義されているのでしょうか。 (AddressOf t1.Ohayou)というパラメータが渡されていますが、このパラメータを受け取っているコンストラクタがどれなのかが分かりません。 ご教示よろしくお願いいたします。 Delegate Sub Myprint(ByVal s As String) Module Module1 Sub Main() Dim t1 As Test1 = New Test1() Dim t2 As TEst2 = New Test2() Dim d As Myprint = New Myprint(AddressOf t1.Ohayou) d.Invoke("VB太郎") d = New Myprint(AddressOf t2.Konbanwa) d.Invoke("VB太郎") End Sub End Module Class Test1 Sub Ohayou(ByVal s As String) Console.WriteLine("おはようございます。{0}です。", s) End Sub End Class Class Test2 Sub Konbanwa(ByVal s As String) Console.WriteLine("こんばんわ。{0}です。", s) End Sub End Class
- 締切済み
- Visual Basic
- C++製DLLにてVB.NET関数を引数付きでコールバックしたい。
C++製DLLにてVB.NET関数を引数付きでコールバックしたい。 以下のようなソリューションがあります。 ソリューションには、VB.NETによるプロジェクトapp、C++によるプロジェクトdllがあり、 名前のとおり、appはWindowsフォームアプリケーション、dllはクラスライブラリです。 *** VisualStudio.NET 2003 ソリューション *** === VB.NETプロジェクト:app.exe === --- Module1.vb --- Module Module1 Delegate Function _t() As Int32 <System.Runtime.InteropServices.DllImport("dll.dll")> Public Function dllfunc(ByVal lpFunc As _t) As Int32 End Function End Module --- Form1.vb --- Public Class Form1 Inherits Form Private button1 As Button Public Sub New() button1 = New Button button1.Parent = Me : button1.Text = "button1" AddHandler button1.Click, AddressOf MyClass.GetEvent End Sub Private Sub GetEvent(ByVal sender As Object, ByVal e As EventArgs) dllfunc(AddressOf func1) End Sub Public Function func1() As Int32 MsgBox("func1@vb.net") Return 123 End Function End Class === C++ライブラリプロジェクト:dll.dll === --- dll.def --- LIBRARY dll EXPORTS dllfunc --- dll.h --- #ifdef DLL_EXPORTS #define DLL_API __declspec(dllexport) #else #define DLL_API __declspec(dllimport) #endif DLL_API void dllfunc(int* vbfunc(void)); -- dll.cpp --- #include "stdafx.h" #include "dll.h" #include "stdio.h" #include "windows.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return true; } DLL_API void dllfunc(int* vbfunc(void)) { char str[16]; sprintf(str,"vbfunc() = %d",vbfunc()); MessageBoxA(NULL,str,"dll",MB_OK); } --- stdafx.cpp, stdafx.h --- (省略) *** ソリューション ここまで *** [ 動作 ] appを実行すると、Form1にbutton1が生成される。 button1をクリックするとGetEventが呼ばれ、func1のアドレスを引数としたdllfunc()を呼びます。 dll側のdllfunc()から、app側のfunc1()を呼び、戻り値の123を表示します。 [ 質問 ] dllfunc()から引数付きでfunc1()を呼びたいが、記述の方法が分かりません。 ご教示お願い致します。
- ベストアンサー
- Visual Basic
- VB2008 Formを関数の引数にする
お世話になります VB2008で開発をしています Formを2つ作成し どちらも同じ名称のテキストBOX(TextBox1)コントロールを貼り付けています Publicの関数でそれぞれのFormに値をセットしたいのですが 「'TextBox1' は 'System.Windows.Forms.Form' のメンバではありません。」 とエラーが発生してしまいます 初歩的な質問で申し訳ありませんが ご助言頂けると助かります 宜しくお願い致します ソース: --------------------------------------------------- Module Module1 Public Sub Main() Dim Form1 As New Form1 Dim Form2 As New Form2 SetValue(Form1) SetValue(form2) End Sub Private Sub SetValue(ByVal obj As Form) obj.TextBox1 = "TEST" End Sub End Module ---------------------------------------------------
- ベストアンサー
- Visual Basic
- C#で、DLL内の関数へのthisの渡し方
例えば以下のように、thisを引数として渡して thisに格納されたWitdhを表示するコードを書いてみたのですが DLL側で以下のようなエラーが出てうまくいきません。 何か引数の渡し方などに問題があるのでしょうか?ご指導お願いします(>o<) ※エラー 'ClassLibrary1.Form1.Dispose(bool)': オーバーライドする適切なメソッドが見つかりませんでした。 ■フォームアプリケーションのコード private void Form1_Load(object sender, EventArgs e) { System.Windows.Forms.Form This_obj = new System.Windows.Forms.Form(); This_obj = this; GetFormWidth(This_obj); } ■↓DLL内のコード public class DLL { public static void GetFormWidth(System.Windows.Forms.Form Form_obj) { //引数のwidthを表示する。 System.Diagnostics.Debug.WriteLine(Form_boj.Width.Tostring()); } }
- ベストアンサー
- C・C++・C#
- VB.NETからC++のdll連携(double)
プログラム初心者です。 double型の配列をVB2010とC++で作成したdllで連携したいのですが、値が正しく渡されません。 値が正しく渡せるにはどうしたら良いでしょうか? 以下がその内容です。(int型の場合)これをdouble型で渡したいのですが。 C++ではSafeArrayの扱いになるとのことですが、方法が良く分かりません。 VBソース ----------------- ' Arrays.vb Imports System Imports Microsoft.VisualBasic Imports System.Runtime.InteropServices Friend NotInheritable Class NativeMethods Private Sub New() End Sub Declare Function TestArrayOfInts Lib "makedll.dll" ( _ <[In](), Out()> ByVal myArray() As Integer, ByVal size As Integer) As Integer End Class Public NotInheritable Class App Private Sub New() End Sub Public Shared Sub Main() ' *************** array ByVal ************** Dim array1(9) As Integer Console.WriteLine("Integer array passed ByVal before call:") Dim i As Integer For i = 0 To array1.Length - 1 array1(i) = i Console.Write(" " & array1(i)) Next i Dim sum1 As Integer = NativeMethods.TestArrayOfInts(array1, array1.Length) Console.WriteLine(ControlChars.CrLf & "Sum of elements:" & sum1) Console.WriteLine(ControlChars.CrLf & "Integer array passed ByVal after call:") For Each i In array1 Console.Write(" " & i) Next i Console.Read() End Sub End Class //********************************** C++作成dllソース(makedll.cpp) extern "C" MAKEDLL_API int TestArrayOfInts( int* pArray, int size ) { int result = 0; for( int i = 0; i < size; i++ ) { result += pArray[ i ]; pArray[ i ] += 100; } return result; } //********************************** C++作成dllソース(makedll.h) #ifdef MAKEDLL_EXPORTS #define MAKEDLL_API __declspec(dllexport) #else #define MAKEDLL_API __declspec(dllimport) #endif extern "C" MAKEDLL_API int TestArrayOfInts( int* pArray, int size ); //********************************** C++作成dllソース(makedll.def) LIBRARY makedll.dll EXPORTS TestArrayOfInts PRIVATE
- ベストアンサー
- C・C++・C#
- 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
- ベストアンサー
- その他(プログラミング・開発)
- VB .NetのDLL参照について
名前付パイプの処理をしているのですが、DLLが参照できません。 Public Class ClsJi01 Public Declare Function MakePipe Lib "\DLL\Point.DLL" (ByVal pipe_name As String, ByVal buf_size As Integer, ByVal max_instances As Short, ByVal hpipe As Integer, ByVal err_code As Integer) As Integer Public Sub M_Pipe() Dim r As Integer Dim rpipe As Integer Dim err_code As Integer r = MakePipe("\\.\pipe\RS04", 255, 16, rpipe, err_code) End Sub End Class Point.DLLは以前VB6.0の時に使用していたDLLで自作です。 これで実行すると「オブジェクト参照がオブジェクト インスタンスに設定されていません。」と出ます。 どうしたら良いのでしょうか?
- ベストアンサー
- Visual Basic
- VB2005ExpressEditionでのUnlha32.dllのエラーコードの出し方
現在VB2005ExpressEditionでUnlha32.dllを使ってファイルの解凍をしようとしています しかし、失敗するのでエラーコードを出させるようにしてみました でも、出てきたのはどうやらエラーコードとは違うもののようなのです Unlha32.dllのエラーコードの出し方が間違っているようなのでエラーコードの出し方を教えてください ソースです↓(半角スペースは全角スペースにしてあります) Public Class Form1 Private Declare Function Unlha Lib "Unlha32.dll" (ByVal CmdLine As String) As Long Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click MsgBox(Unlha("e C:\test.lzh -x1a1 -c C:\ *.*")) End Sub End Class
- ベストアンサー
- Visual Basic
- vb.netで教えてgooにログインしたい
参照設定でMicrosoft Internet Controlsを選択し、 モジュールに ******************************************************** Sub osietegoo() Dim objIE As InternetExplorer On Error GoTo Err0 '既にログイン済みなら objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate("https://c.oshiete.goo.ne.jp/mypage.php3") Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents() Loop objIE.Document.all("uname").Value = "test" objIE.Document.all("pass").Value = "test" objIE.Document.all("Submit3").Click() Err0: '既にログイン済みなら If Err.Number = 13 Then End If objIE = Nothing End Sub ******************************************************** を貼りつけました。 その結果、 InternetExplorerの部分と DoEventsの部分がエラーになります。 (画像を参照してください) Module Module1の外に、Imports で何かを宣言しなくてはいけないですか? そもそも上記のコードはVBAなのですが VBで使う場合どうすればいいでしょうか? ご回答よろしくお願いします。
- ベストアンサー
- Visual Basic
- VB2008: 独自例外とは?
独自例外の確認ための質問をします。 独自例外の発生をキャッチして表示する術がわからなくて苦肉の策でエラートラップを利用。 しかし、こういう事であれば何も独自例外を設定する必要がありません。 と思ったり、「スルーだからテストに<0除算>を選んだのが悪いのか?」と考えたり。 ともかく、判っているのか判っていないのかが判らない状態に陥っています。 そういうことで、独自例外について少し教えて頂ければ幸いです。 ' ============================== ' クラスプログラミング; 演習2 ' ============================== Module theClass Sub Main() On Error GoTo Error_Main Dim T1 As New TEST1 Debug.Print(T1.MembersLengthAverage.ToString) Exit_Main: Exit Sub Error_Main: ErrorMsg(Err.Description & "(Main)") Resume Exit_Main End Sub End Module ' ================================================================== ' クラス TEST1 ' ================================================================== <Serializable()> Public Class TEST1 Private _MemberCount As Integer Private _Member1 As String Private _Member2 As String ReadOnly Property MembersLengthAverage() As Integer Get If _MemberCount <> 0 Then Return (_Member1.Length + _Member2.Length) \ _MemberCount Else Throw New System.Exception("TEST1: 除算エラーが発生しました。" ) End If End Get End Property Public Sub New() _Member1 = "" _Member2 = "" End Sub End Class
- ベストアンサー
- Visual Basic
お礼
回答ありがとうございました。