VB.NETからDLLを呼び出したいのですが、これが私のコンピューターと
顧客側のコンピュータとで環境が違う為、毎回ファイルの場所を変えて
使用しています。(ソース内のファイル場所を毎回書き換える)
これを、hostnameの取得により、私のパソコンとその他の環境とで
呼び出す状況を変えたいと思っております。
どの様にすれば良いか、教えて下さい。
Windowsの環境変数のPATHに書き込みはしたくありません。
あくまで、プログラム内で終わらせたいのですが・・
(ソース例)
’↓固定変数でないとダメ?
Public Const MyDllFileName As String = "\\ServerName\Kyouyu\MyDllFile.dll"
'Type(1)
Public Declare Function ExportDLL1 Lib MyDllFileName (ByRef MyData As MyStructure) As Integer
'Type(2)
<DllImport(MyDllFileName)> Public Function ExportDLL2(ByRef MyData As MyStructure) As Integer
End Function
No.5ベストアンサー
- 回答日時:
前の書き込みの続きです。
※以下が、サンプルソース(2)です。。
//DllLoader.vb Start//
Imports System.Runtime.InteropServices
''' <summary>
''' 動的DLLローダー
''' </summary>
''' <remarks></remarks>
Public Class DllLoader
Implements IDisposable
Private Class kernel32API
<DllImport("kernel32", CharSet:=CharSet.Auto, SetLastError:=True)> _
Public Shared Function LoadLibrary(ByVal lpFileName As String) As IntPtr
End Function
<DllImport("kernel32", CharSet:=CharSet.Auto, SetLastError:=True)> _
Public Shared Function FreeLibrary(ByVal hModule As IntPtr) As Boolean
End Function
<DllImport("kernel32", CharSet:=CharSet.Ansi, SetLastError:=True)> _
Public Shared Function GetProcAddress(ByVal hModule As IntPtr, ByVal lpProcName As String) As IntPtr
End Function
End Class
Private _ptrModule As IntPtr = IntPtr.Zero
#Region "APIで発生した最後のエラー"
Private _lastErrorNo As Integer = 0
Public ReadOnly Property LastErrorNo() As Integer
Get
Return _lastErrorNo
End Get
End Property
#End Region
#Region "コンストラクタ"
''' <summary>
''' コンストラクタ
''' </summary>
''' <param name="p_strDllFullPath">DLLのフルパス</param>
''' <remarks></remarks>
Public Sub New(p_strDllFullPath As String)
_ptrModule = kernel32API.LoadLibrary(p_strDllFullPath)
If (_ptrModule = IntPtr.Zero) Then
_lastErrorNo = Marshal.GetHRForLastWin32Error
Dim ex As Exception = Marshal.GetExceptionForHR(_lastErrorNo)
Throw ex
End If
End Sub
#End Region
#Region "ロードしたDLLの解放処理"
''' <summary>
''' ロードしたDLLの解放処理
''' </summary>
''' <remarks></remarks>
Private Sub FreeLoder()
If (_ptrModule = IntPtr.Zero) Then
Return
End If
If Not kernel32API.FreeLibrary(_ptrModule) Then
_lastErrorNo = Marshal.GetHRForLastWin32Error
Dim ex As Exception = Marshal.GetExceptionForHR(_lastErrorNo)
Throw ex
End If
End Sub
#End Region
#Region "Delegateの取得"
''' <summary>
''' Delegateの取得
''' </summary>
''' <param name="p_strProcName">発行を行うメソッド名</param>
''' <param name="p_typProcType">発行を行うメソッド型</param>
''' <returns></returns>
''' <remarks></remarks>
Public Function GetDelegate(ByVal p_strProcName As String, ByVal p_typProcType As Type) As [Delegate]
If (_ptrModule = IntPtr.Zero) Then
Return Nothing
End If
Dim l_ptrProcAddress As IntPtr = kernel32API.GetProcAddress(_ptrModule, p_strProcName)
If (l_ptrProcAddress = IntPtr.Zero) Then
_lastErrorNo = Marshal.GetHRForLastWin32Error
Dim ex As Exception = Marshal.GetExceptionForHR(_lastErrorNo)
Throw ex
End If
Return Marshal.GetDelegateForFunctionPointer(l_ptrProcAddress, p_typProcType)
End Function
#End Region
#Region "IDisposable Support"
Private disposedValue As Boolean ' 重複する呼び出しを検出するには
Protected Overridable Sub Dispose(disposing As Boolean)
If (Not Me.disposedValue) Then
If (disposing) Then
Call FreeLoder()
End If
End If
Me.disposedValue = True
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region
End Class
//DllLoader.vb End//
ご回答ありがとうございます。
これが、知りたかった質問の内容と一致しております。
これを参考に、したいと思います。
ありがとうございました。
No.4
- 回答日時:
以前、DllLoaderという動的DLLを起動するライブラリを作ったので、それを張っておきます。
※参考資料を求めるのであれば、以下のキーワードを参考にしてください。
LoadLibrary
GetProcAddress
FreeLibrary
※以下が、ライブラリを起動するための構成です。
1.[Class1.vb]→→→→「2のサンプル」の起動
2.[Sample.vb]→→→→「3のDllLoader」呼出実行例
3.[DllLoader.vb]→→→ライブライリの本体
文字制限で全部を張る事ができないので、ソースを分割します。
※以下が、サンプルソース(1)です。。
//Class1.vb Start//
Public Class Class1
Shared Sub Main()
Dim l_SampleStatic As New Sample.静的()
l_SampleStatic.実行()
Dim l_SampleDynamic As New Sample.動的()
l_SampleDynamic.実行()
End Sub
End Class
//Class1.vb End//
//Sample.vb Start//
Imports System.Runtime.InteropServices
Public Class Sample
<StructLayout(LayoutKind.Sequential)> _
Private Structure RECT
Public left As Int32
Public top As Int32
Public right As Int32
Public bottom As Int32
End Structure
Private Shared Sub 取得情報表示(p_rectWk As RECT)
'取得した情報を出力
Dim l_aryPrms As New List(Of String)()
l_aryPrms.Add(ControlChars.CrLf)
l_aryPrms.Add(p_rectWk.left.ToString())
l_aryPrms.Add(p_rectWk.right.ToString())
l_aryPrms.Add(p_rectWk.top.ToString())
l_aryPrms.Add(p_rectWk.bottom.ToString())
Dim l_strMsg As String = String.Format("Left:{1}{0}Right:{2}{0}Top:{3}{0}Bottom:{4}", l_aryPrms.ToArray())
MsgBox(l_strMsg, MsgBoxStyle.Information, "デスクトップ矩形情報")
End Sub
#Region "静的なDLLの利用"
Public Class 静的
<DllImport("user32.dll")> _
Private Shared Function GetWindowRect(ByVal hwnd As IntPtr, ByRef lpRect As RECT) As Integer
End Function
<DllImport("user32.dll")> _
Private Shared Function GetDesktopWindow() As IntPtr
End Function
Public Sub 実行()
'矩形情報を格納する変数
Dim l_rectWk As New RECT
'デスクトップハンドルを取得
Dim l_ptrDeskTop As IntPtr = GetDesktopWindow()
'デスクトップハンドルから矩形を取得
Call GetWindowRect(l_ptrDeskTop, l_rectWk)
Call 取得情報表示(l_rectWk)
End Sub
End Class
#End Region
#Region "動的なDLLの利用"
Public Class 動的
Private Delegate Function GetWindowRectDelegate(ByVal hwnd As IntPtr, ByRef lpRect As RECT) As Integer
Private Delegate Function GetDesktopWindowDelegate() As IntPtr
Public Sub 実行()
Dim l_strDllPath As String = String.Empty
If Not OpenFileDialog(l_strDllPath) Then
Return
End If
Using l_dll As New DllLoader(l_strDllPath)
'GetDesktopWindow
Dim l_method_GetDesktopWindow As GetDesktopWindowDelegate = l_dll.GetDelegate("GetDesktopWindow", GetType(GetDesktopWindowDelegate))
'GetWindowRect
Dim l_method_GetWindowRect As GetWindowRectDelegate = l_dll.GetDelegate("GetWindowRect", GetType(GetWindowRectDelegate))
'矩形情報を格納する変数
Dim l_rectWk As New RECT
'デスクトップハンドルを取得
Dim l_ptrDeskTop As IntPtr = l_method_GetDesktopWindow.Invoke()
'デスクトップハンドルから矩形を取得
Call l_method_GetWindowRect.Invoke(l_ptrDeskTop, l_rectWk)
Call 取得情報表示(l_rectWk)
End Using
End Sub
Private Function OpenFileDialog(ByRef p_strRetPath As String) As Boolean
Using l_dlgOpen As New OpenFileDialog()
l_dlgOpen.Title = "DLLを指定"
l_dlgOpen.Filter = "user32.dllファイル(user32.dll)|user32.dll|DLLファイル(*.dll)|*.dll"
l_dlgOpen.FileName = "user32.dll"
If Not (l_dlgOpen.ShowDialog() = DialogResult.OK) Then
Return False
End If
p_strRetPath = l_dlgOpen.FileName
End Using
Return True
End Function
End Class
#End Region
End Class
//Sample.vb End//
ご回答ありがとうございます。
これが、知りたかった質問の内容と一致しております。
これを参考に、したいと思います。
ありがとうございました。
No.3
- 回答日時:
> Windowsの環境変数のPATHに書き込みはしたくありません。
プロセス単位で設定できます。
http://msdn.microsoft.com/ja-jp/library/96xafkes …
No.2
- 回答日時:
> 他の会社がDLLファイルを提供しています。
他社に、環境変数が通るディレクトリにインストールしてもらうよう
依頼するか、自分が作成するexeに同梱させるかのどちらかでしょうね。
ネイティブなDLLを利用するなら、%SystemRoot%\system32にセットアップされるか、
利用者が自分でセットアップしろという感じで説明書があっても
いいような気もしますが・・・。
ご回答ありがとうございます。
DLLを自分のアプリの場所にコピーか、PATHの通っている場所にコピーか
を含めて検討致します。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# ネット上に公開されているFF...
-
python エラー
-
アプリケーションのDLLファイル...
-
<unistd.h>をVisualStudioでつ...
-
AIXとCOBOLについて
-
エクセルのエラーメッセージ「4...
-
unsigned long long 型のフォー...
-
C#で char型とstring型の比較で...
-
DIRECTXで質問です。
-
教えてgooについて
-
ダイアログなどの文字列が文字...
-
VBAを何回も作り直して、容量が...
-
Cygwinでのコンパイルができま...
-
ビープ音が鳴りません・・・
-
エクセルVBAではRound...
-
未解決の外部シンボル
-
キーの自動入力
-
適切な変換関数が存在しない???
-
C言語のコンパイルができません
-
Debug Assertion Failed
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6.0(SP6)にて開発を行なって...
-
C# DLL エントリ ポイントが...
-
VBAエディタのコード画面で、カ...
-
ASP.NETのDLL入れ替えについて
-
visual studioの不要なDll削除方法
-
WIN10で常にフォームを手前に
-
ファイルをvbaで圧縮したいので...
-
指定された引数が有効範囲にな...
-
VC++6.0 でのライブラリ参照方法
-
res://ieframe.dll/について
-
VBにてIMEの入力モードを変える...
-
user32.dllがないためアプリが...
-
自作のDLLがみつからない
-
wavからmp3に変換する方法
-
VB.NET xdoc2txtをつかってPDF...
-
メイクファイルからdllを生成す...
-
vb6で作成した画面が処理に時間...
-
steamのゲームが起動しません。
-
scrrun.dllの読み方を教えてく...
-
手書き文字認識のdll
おすすめ情報