iniを読み込むプログラムを作ったのですけれど、
環境はVB.NETです。
<ソース全体>
Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _
(ByVal lpAppName As String, ByVal lpKeyName As String, _
ByVal lpDefault As String, ByVal lpReturnedString As String, _
ByVal nSize As Integer, ByVal iniFilename As String) As Integer
Dim intLen As Integer '文字列長
Dim syutoku As String
Public Function GetIni(ByVal INIFILEsection As String, _
ByVal INIFILEKey As String, _
ByVal INIFILEDefaultString As String, _
ByVal INIFILEnFileName As String, _
ByRef INIFILEstrTemp As String) As String
'バッファを確保
INIFILEstrTemp = ""
INIFILEstrTemp = INIFILEstrTemp.PadLeft(1024, Chr(0))
intLen = Len(INIFILEstrTemp)
GetPrivateProfileString(INIFILEsection, INIFILEKey, INIFILEDefaultString, _
INIFILEstrTemp, intLen, INIFILEnFileName)
End FunctionPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
GetIni("bbb", "sss", "パラメータが存在しません", "C:\Documents and Settings\正一\デスクトップ\ff.ini", syutoku)
'GetIni([]のついている所を読むための名称, _
'xxx=とついている所の名前(分かりにくかったら下を参照), _
' 左で設定した値が存在しないときの戻る値や文字列, _
'読み込むiniファイルのパスを記載, _
'戻ってきた数字やパラメータの値を入れる所)
MessageBox.Show(syutoku)
End Sub
=========================================================
[aaa]
sss=実験
fff=ためし
[bbb]
sss=実験2
の中で
Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _
(ByVal lpAppName As String, ByVal lpKeyName As String, _
ByVal lpDefault As String, ByVal lpReturnedString As String, _
ByVal nSize As Integer, ByVal iniFilename As String) As Integer
Dim intLen As Integer '文字列長
Public Function GetIni(ByVal INIFILEsection As String, _
ByVal INIFILEKey As String, _
ByVal INIFILEDefaultString As String, _
ByVal INIFILEnFileName As String, _
ByRef INIFILEstrTemp As String) As String
'バッファを確保
INIFILEstrTemp = ""
INIFILEstrTemp = INIFILEstrTemp.PadLeft(1024, Chr(0))
intLen = Len(INIFILEstrTemp)
GetPrivateProfileString(INIFILEsection, INIFILEKey, INIFILEDefaultString, _
INIFILEstrTemp, intLen, INIFILEnFileName)
End Function
の部分をDLLにしたいんですけれど、
DLLファイルにするときの記述のやり方はこれで良いのでしょうか?
あと、DLLファイルにするやり方を教えてください。
いつも通りでやると、EXEファイルになってしまいます。
それともうひとつ、
出来上がったDLLファイルを外部から呼び出す方法も教えてください。
長文になってしまいすみません。
INIファイルの読み出しだけしか実装しない
DLLなんてあまり意味がないような気もしますが・・・
EXEを配布する時に余分なファイルが増えるし。
まぁやるとしたらプロジェクトの新規作成でクラスライブラリを
選択してソース貼り付ければDLLは作成出来ます。
出来上がったDLLはメニューのプロジェクト - 参照の追加で
出来上がったファイルを追加してください。
kenさんに言われたとおりやりましたら、DLLファイルが生成されました。
そして、そのDLLファイルに実験で外部接続しようと思って、
参照の追加をしようとしたところ作成したDLLファイルがどこにあるか見つかりませんから実行ファイルと同じディレクトリに移動させて、
そして、そのDLLファイルの名前をtest1に変えて、
ソースに
Public Declare Function GetIni Lib _
"test1.dll" _
(ByVal INIFILEsection As String, _
ByVal INIFILEKey As String, _
ByVal INIFILEDefaultString As String, _
ByVal INIFILEnFileName As String, _
ByRef INIFILEstrTemp As String) As String
Dim syutoku As String
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
With OpenFileDialog1
.FileName = ""
.Filter = "INIファイル|*.ini"
.ShowDialog()
GetIni("bbb", "sss", "パラメータが存在しません", .FileName, syutoku)
'GetIni([]のついている所を読むための名称, _
'xxx=とついている所の名前(分かりにくかったら下を参照), _
' 左で設定した値が存在しないときの戻る値や文字列, _
'読み込むiniファイルのパスを記載, _
'戻ってきた数字やパラメータの値を入れる所)
MessageBox.Show(syutoku)
End With
End Sub
を記載したんですけれど、
動いてくれませんでした。
どこが原因なのでしょうか?
書き忘れました。
そのときのエラー内容が
DLL test1.dllのGetIniというエントリーポイントが見つかりません。
でした。
『Public Function GetIni』自体はPublicで定義されているようですが、
その外側のClassやModuleなどは、Publicで定義されていますか?
ModuleなどがFreindレベルで定義されていると、外部から利用できませんよ。
> Public Declare Function GetIni Lib _
> "test1.dll" _
Declareが必要なのは、関数がエクスポートされているタイプのDLLの場合です。
.NET用のDLLやCOMタイプのDLLは、「参照設定」するだけで利用できますので、
今回の場合、Declare宣言は不要かと。
その時の中のソースが
Public Class Class1
Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _
(ByVal lpAppName As String, ByVal lpKeyName As String, _
ByVal lpDefault As String, ByVal lpReturnedString As String, _
ByVal nSize As Integer, ByVal iniFilename As String) As Integer
Dim intLen As Integer '文字列長
Public Function GetIni(ByVal INIFILEsection As String, _
ByVal INIFILEKey As String, _
ByVal INIFILEDefaultString As String, _
ByVal INIFILEnFileName As String, _
ByRef INIFILEstrTemp As String) As String
'バッファを確保
INIFILEstrTemp = ""
INIFILEstrTemp = INIFILEstrTemp.PadLeft(1024, Chr(0))
intLen = Len(INIFILEstrTemp)
GetPrivateProfileString(INIFILEsection, INIFILEKey, INIFILEDefaultString, _
INIFILEstrTemp, intLen, INIFILEnFileName)
End Function
End Class
なんですけど・・・
これだと、問題がありますか?
>Declareが必要なのは、関数がエクスポートされているタイプのDLLの場合です。
>.NET用のDLLやCOMタイプのDLLは、「参照設定」するだけで利用できますので、
>今回の場合、Declare宣言は不要かと。
参照の追加からその作成したDLLが見つかりません(TT)
できたDLLファイルをどこに移動させればいいのでしょうか?
あと、参照の追加の中でどこら辺にそれがあるかも教えてください。(上のタブで)
参照の追加のダイアログを開いたら参照ってボタンがあるじゃないですか。
編集 削除参照ボタンが見つかりました。
そして、それを参照させて、
ソースを記載したらなぜかまたエラーになってしまいました。
===============ソース=========================
Imports ClassLibrary1
Dim syutoku As String
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
With OpenFileDialog1
.FileName = ""
.Filter = "INIファイル|*.ini"
.ShowDialog()
GetIni("bbb", "sss", "パラメータが存在しません", .FileName, syutoku)
'GetIni([]のついている所を読むための名称, _
'xxx=とついている所の名前(分かりにくかったら下を参照), _
' 左で設定した値が存在しないときの戻る値や文字列, _
'読み込むiniファイルのパスを記載, _
'戻ってきた数字やパラメータの値を入れる所)
MessageBox.Show(syutoku)
End With
End Sub
===================================================================
GetIniでエラーなってしまいました。
エラー内容が
名前"GetIni"は宣言されていません。
と出てしまいました。
なぜでしょうか?
Dim obj As New ClassLibrary1.Class1
で変数を作って
obj.GetIni("bbb","sss","パラメータが存在しません",.FileName,syutoku)
としましょう。
ありがとうございます。
解決しました。
> これだと、問題がありますか?
こういう時は、Newせずに使えるよう、「Shared Function」にした方が良いのでは。
(その場合、intLenの宣言位置を変更する必要がありますけど)
>こういう時は、Newせずに使えるよう、「Shared Function」にした方が良いのでは。
>(その場合、intLenの宣言位置を変更する必要がありますけど)
というのはどう記述すればいいのでしょうか?
そのような関数を使ったことがないので、わかりません。
ヘルプ見た?
編集 削除ヘルプでの検索の仕方がわかりません。
環境:VB.NET