HAMLOG プログラム開発室


新着表示
タイトル
記事No
投稿日
投稿者
参照先
dbf_rcount
110
2009/07/21(Tue) 17:17:45
JA2BQX 太田

こんにちは。
昨日よりVB2008を勉強中です。
WndProc を使用しての Hamlogよりのデータ取得は出来る様になりました。

次にHDBに直接アクセスするテストをしていますが入り口でつまずいています。
下記のコードで ver = GetThdllVersion() に関してはVB6と同じ値が取れました。

C:\Windows\System32\Hamlog.dll
タイムスタンプ 値
2008-06-19 331776
2009-05-23 332544

しかしレコード件数の取得がダメです。
sd = dbf_open("C:\HAMLOG\Hamlog.hdb", Th)
recno = dbf_rcount(Th)
...では ゼロ件と表示されます。


sd = Vdbf_open("C:\HAMLOG\Hamlog.hdb", log)
recno = Vdbf_rcount(log)
...ではマイナスになったり極端に大きな数値になったりでダメです。

どなたか上手く動作しておられたらご指導お願いします。
(図表モードでもインデントが取れなくて見難いですね)



Imports System
Imports System.Windows.Forms
Imports System.Runtime.InteropServices

Public Class Form1

Structure TDBFh
Dim lupdt() As Byte
Dim Rcount As Integer
Dim hsize As Integer
Dim recnm As Integer
Dim fHdl As Integer
Dim Temp() As Byte
Public Sub Initialize()
ReDim lupdt(4)
ReDim Temp(260)
End Sub
End Structure


Structure TThLog
Dim Qso() As Byte
Public Sub Initialize()
ReDim Qso(3927)
End Sub
End Structure

_
Private Shared Function GetThdllVersion() As Integer
End Function


_
Private Shared Function dbf_open(ByRef s As String, ByRef d As TDBFh) As Integer 'ByValをByRefに変更
End Function

_
Private Shared Sub dbf_close(ByRef d As TDBFh)
End Sub

_
Private Shared Function dbf_rcount(ByRef d As TDBFh) As Integer
End Function


_
Private Shared Function Vdbf_open(ByRef s As String, ByRef d As TThLog) As Integer
End Function

_
Private Shared Sub Vdbf_close(ByRef d As TThLog)
End Sub

_
Private Shared Function Vdbf_rcount(ByRef d As TThLog) As Integer
End Function

Public log As TThLog
Public Th As TDBFh

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim ver As Int32
Dim sd As Int32
Dim recno As Int32

ver = GetThdllVersion()
Label1.Text = ver

'dbf_close(Th)

'sd = dbf_open("C:\HAMLOG\Hamlog.hdb", Th)
'recno = dbf_rcount(Th)
'dbf_close(Th)

sd = Vdbf_open("C:\HAMLOG\Hamlog.hdb", log)
recno = Vdbf_rcount(log)
Vdbf_close(log)

Label2.Text = recno

End Sub


End Class
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: データの表示方法をご教授ください
109
2009/07/19(Sun) 13:59:03
JA1RNR 吉田康太郎
JR1CPB 稲村さん、こんにちは。

はい、無料で利用できるので助かっています。
おかげさまで、太田さん、大塚さんから貴重なソースの公開をしていただき、Hamlogデータのやり取りの基本ができるようになりました。
最近は7MHzの伝搬状態がよくありませんので、少しプログラミング勉強をしたいと思い取り掛かかりました。

> .NET ExpressEditionは無料の開発環境なので、プログラミングの
> 勉強には最適ですね.
> 私もVB.NETでTh505apiを利用するプログラミングで躓いたままに
> なっていましたが、大塚さんと吉田さんのスレッドを見てまたや
> る気になりました。Hi
> おかげさまで、hdbからの交信データの読み出しや、入力ウィンド
> ウの項目の受け渡しができるようになりました。
> 簡単な交信データの集計をするプログラムを作ったりしています。
>
> 吉田さん、ご健闘ください。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: データの表示方法をご教授ください
108
2009/07/19(Sun) 13:46:06
JA1RNR 吉田康太郎
JA2GRC/3/大塚さん、はじめまして。

太田さんからWndprocのご助言を、さらに大塚さんから具体的なソースを公開していただき、まことに有難うございました。
おかげさまでHamlogデータの取り込みができました。
重ねて御礼を申し上げます。

私には大変難解でした。大塚さんの作製された部分をデッドコピーさせていただき、Hamlogデータを取り込めることができました。

私は、PSK31の運用に、MixWを使っています。
MixWのログファイルは、簡単な構造ですので、Hamlogで読めるCSV形式に変換するプログラムをVB2008(2005)で作成しHamlogに結合しています。

そこで、もう少しスマートにデータのやり取りができないものかと思い今回の課題に取り掛かった次第です。

大塚さん、太田さん重ねて御礼申し上げます。

> 昨日、KANHAM 2009でJA2BQX/太田さんにお会いして、この開発室で、
> VB2008 Ex. Ed. に関する質問が出ていることを聞きました。
>
> もし、まだ、解決されていないのなら、以下の記事を参考にされて
> ください。
>
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: データの表示方法をご教授ください
107
2009/07/19(Sun) 10:46:32
jr1cpb/稲村
.NET ExpressEditionは無料の開発環境なので、プログラミングの
勉強には最適ですね.
私もVB.NETでTh505apiを利用するプログラミングで躓いたままに
なっていましたが、大塚さんと吉田さんのスレッドを見てまたや
る気になりました。Hi
おかげさまで、hdbからの交信データの読み出しや、入力ウィンド
ウの項目の受け渡しができるようになりました。
簡単な交信データの集計をするプログラムを作ったりしています。

吉田さん、ご健闘ください。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: データの表示方法をご教授ください
106
2009/07/19(Sun) 09:28:27
JA2GRC/3 大塚

JA1RNR/吉田さん、JA2GRC/3/大塚です

昨日、KANHAM 2009でJA2BQX/太田さんにお会いして、この開発室で、
VB2008 Ex. Ed. に関する質問が出ていることを聞きました。

もし、まだ、解決されていないのなら、以下の記事を参考にされて
ください。

私も、この3月からVB2008 Ex. Ed. を勉強し始めたばかりの初心者
ですが、同じ問題で躓きました。 VB.Netの実例は少ないので、
結構苦労しました。

今は快適に動いていますので、参考になればどうぞ。

http://hirotaka929.cocolog-nifty.com/blog/2009/06/hamlog-60a0.html
(URLは1行にして読み出してください)

前半が、Hamlogへの登録、後半がHamlogからの読み出しです。

それでは、ご健闘を!

PS: VB2008 Ex. Ed. の仲間が増えて嬉しいことです。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: データの表示方法をご教授ください
105
2009/07/17(Fri) 17:23:37
JA2BQX 太田

こんにちは。
午前中に何回も投稿しようとしてその度にエラーだったのでメールで失礼しました。 
その後、内容を書き換えたら投稿出来ました。

私もVB6で、今回の件が分からずに苦労してJA4管内の方に教えていただいた事がありました。
上手く動作するようになると良いですね。

明日、早朝より関ハムに出かけるので留守になります。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: データの表示方法をご教授ください
104
2009/07/17(Fri) 16:46:05
JA1RNR 吉田康太郎
JA2BQX 太田様

私宛のメールも拝見しました。
いろいろお手数をおかけいたし有り難うございます。

メールでご紹介いただきましたサンプルプログラムなども参考にして、勉強いたします。
取り急ぎお礼まで。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: データの表示方法をご教授ください
103
2009/07/17(Fri) 15:45:57
JA1RNR 吉田康太郎
JA2BQX 太田様
こんにちは。
早速ご助言いただきまして有り難うございます。

> 下記にフックについての説明があります。
> http://www.kab-studio.biz/Programing/Codian/DLL_Hook_SClass/06.html
>
> 以前、ここの「開発室」にも話題として出た事があったと思いますが
> リニューアルの前だったようで現在は無くなっていますね。
>
> WndProc などをキーワードで検索して見て下さい。
>
> 下記が良いかも知れません。
> プロセス間通信(SendMessage)
> 受信側のコード
>
> URLをコピペしたらサーバーエラーで投稿出来なかったので
>
> 「プロセス間通信(SendMessage)」キーワードで検索して見て下さい。

ご紹介くださいましたものを、検索して調べました。
初心者には難解なことばかりで、まだ解決には至っていません。

これから時間をかけて、勉強していきます。
有り難うございました。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: データの表示方法をご教授ください
102
2009/07/17(Fri) 11:42:09
JA2BQX 太田

こんにちは。

> 私は、Microsoft Visual Basic 2008 Express Editionを勉強中のプログラミング初心者で、Windows APIの知識はありません。(Win XP Home Edition SP3を使っています。)

私はVB6なので肝心な部分でのお役にはたてないと思いますが
ソースを拝見した限りでは「フック」関係が無いような...。

下記にフックについての説明があります。
http://www.kab-studio.biz/Programing/Codian/DLL_Hook_SClass/06.html

以前、ここの「開発室」にも話題として出た事があったと思いますが
リニューアルの前だったようで現在は無くなっていますね。

WndProc などをキーワードで検索して見て下さい。

下記が良いかも知れません。
プロセス間通信(SendMessage)
受信側のコード

URLをコピペしたらサーバーエラーで投稿出来なかったので

「プロセス間通信(SendMessage)」キーワードで検索して見て下さい。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

データの表示方法をご教授ください
101
2009/07/16(Thu) 14:41:52
JA1RNR 吉田康太郎
HAMLOGから取得したデータの表示方法をご教授いただけませんでしょうか。

私は、Microsoft Visual Basic 2008 Express Editionを勉強中のプログラミング初心者で、Windows APIの知識はありません。(Win XP Home Edition SP3を使っています。)

HamlogMs.txtにある「Turbo HAMLOG/Win とのデータのやりとりについて」のVB6版用を参考にして下記のプログラムを書きました。
(WindowsフォームのForm1に TextBox(Multiline)を一つ Buttonを四つ その他に RadioButton と CheckBox を貼り付けています。)

ここでは、Button1クリックでHamlogからデータを取得してTextBox1に表示させ、
また、Button2クリックでHamlogへデータ転送をさせようしています。

あらかじめHamlogの入力ウインドウにデータを入れておき、このプログラムを実行し、Button1をクリックしても TextBox1に表示させようとしますが、何も表示できません。

HamlogMs.txtのご説明に、「ハムログ内部では、(cbData==0)または(lpData==NULL)で呼び出された場合、呼び出し側アプリのSendMessage()の第3引数のハンドルに文字列を返送する。」とありますが、私にはこの返送された文字列を表示する方法がわかりません。お教えいただければ幸いです。

なお、Button2をクリックしたときは、TextBox1のデータは正常にHamlogに転送できました。

********************************************************************************
以下はVisual Basic 2008用のソースプログラムです。

Public Class Form1
Public Structure COPYDATASTRUCT
Public dwData As Integer
Public cbData As Integer
Public lpData As String
End Structure
------------------------------------------------------------------------------
Public Const THW_ENTER = &H10000 ' データ送信後、ENTERキーを押したのと同じ
Public Const THW_FOCUS = &H20000 ' データ送信後、編集ボックスにフォーカス
Public Const THW_SAVEBOX_ON = &H40000 ' データ保存時、確認MessageBox表示あり
Public Const THW_SAVEBOX_OFF = &H80000 ' データ保存時、確認MessageBox表示なし
Public Const THW_APPLIHWND = &H100000 ' メインウインドウのハンドルを返す
Public Const WM_COPYDATA As Integer = &H4A
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal cName As String, ByVal wName As Integer) As Integer
Public Declare Auto Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Integer, ByVal wMsg As Integer, ByRef wParam As Integer, _
ByRef lParam As COPYDATASTRUCT) As Integer
Public Declare Function SetForegroundWindow Lib "user32" (ByVal wnd As Integer) As Integer

================================================================================
Hamlogデータを取得しようとしている部分です

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim Hwnd1, Hwnd2, cmmd As Integer
Dim cds As New COPYDATASTRUCT

Hwnd1 = FindWindow("TThwin", 0)

If Hwnd1 < 1 Then
Me.TextBox1.Text = "HAMLOGが起動していません"
Exit Sub
End If

cmmd = 115
cmmd = cmmd Or THW_APPLIHWND
cds.dwData = cmmd
cds.cbData = 0
cds.lpData = vbNullString

Hwnd2 = SendMessage(Hwnd1, WM_COPYDATA, Me.TextBox1.Handle, cds)

End Sub

ここまでがうまくいかない部分です
================================================================================
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Dim cmmd As Integer
Dim Hwnd1 As Integer, Hwnd2 As Integer
Dim cds As New COPYDATASTRUCT
Dim cbuff As String
Dim WorkLeng, Scunt, Wcunt As Integer

If Me.RadioButton1.Checked = True Then
cmmd = 1
End If
If Me.RadioButton2.Checked = True Then
cmmd = 2
End If
If Me.RadioButton3.Checked = True Then
cmmd = 3
End If
If Me.RadioButton4.Checked = True Then
cmmd = 4
End If
If Me.RadioButton5.Checked = True Then
cmmd = 5
End If
If Me.RadioButton6.Checked = True Then
cmmd = 6
End If
If Me.RadioButton7.Checked = True Then
cmmd = 7
End If
If Me.RadioButton8.Checked = True Then
cmmd = 8
End If
If Me.RadioButton9.Checked = True Then
cmmd = 9
End If
If Me.RadioButton10.Checked = True Then
cmmd = 10
End If
If Me.RadioButton11.Checked = True Then
cmmd = 11
End If
If Me.RadioButton12.Checked = True Then
cmmd = 12
End If
If Me.RadioButton13.Checked = True Then
cmmd = 13
End If
If Me.RadioButton14.Checked = True Then
cmmd = 14
End If
If Me.RadioButton15.Checked = True Then
cmmd = 15
End If
If Me.RadioButton16.Checked = True Then
cmmd = 16
End If

If cmmd < 16 Then
If Me.TextBox1.Text = "" Then
MessageBox.Show("登録データが入力されていません。", "入力データ確認", MessageBoxButtons.OK, MessageBoxIcon.Information)
Exit Sub
End If
End If

Hwnd1 = FindWindow("TThwin", 0)

If Hwnd1 < 1 Then ' ハムログが起動していない
Me.TextBox1.Text = "HAMLOGが起動していません"
Exit Sub
End If


cbuff = TextBox1.Text


WorkLeng = Len(cbuff)

Scunt = 0
Wcunt = 0
For ch As Integer = 0 To WorkLeng - 1
If Asc(cbuff.Substring(ch, 1)) >= 0 And Asc(cbuff.Substring(ch, 1)) < 256 Then
Scunt = Scunt + 1
Else
Wcunt = Wcunt + 1
End If
Next

If cmmd <= 15 Then
cds.cbData = Scunt + (Wcunt * 2)
End If

cmmd = cmmd Or THW_FOCUS
cmmd = cmmd Or THW_ENTER
cds.dwData = cmmd
cds.lpData = (cbuff)

Hwnd2 = SendMessage(Hwnd1, WM_COPYDATA, Me.Handle, cds)

If Hwnd2 > 0 Then
SetForegroundWindow(Hwnd2)
If Me.CheckBox1.Checked = True Then
cmmd = 18
cmmd = cmmd Or THW_SAVEBOX_ON
cds.dwData = cmmd
SendMessage(Hwnd1, WM_COPYDATA, Me.Handle, cds)
End If
If Me.CheckBox2.Checked = True Then
cmmd = 18
cmmd = cmmd Or THW_SAVEBOX_OFF
cds.dwData = cmmd
SendMessage(Hwnd1, WM_COPYDATA, Me.Handle, cds)
End If
End If

End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

Me.Close()

End Sub

Public Sub New()

InitializeComponent()

Me.Text = "Tes Program"
Me.Label1.Text = "データ"
Me.GroupBox1.Text = "処理を選択する"

Me.RadioButton1.Text = "CallSign"
Me.RadioButton2.Text = "QSO Date"
Me.RadioButton3.Text = "QSO Time"
Me.RadioButton4.Text = "His RST"
Me.RadioButton5.Text = "My RST"
Me.RadioButton6.Text = "Freqency(MHz)"
Me.RadioButton7.Text = "MODE"
Me.RadioButton8.Text = "JCC/JCG"
Me.RadioButton9.Text = "Grid"
Me.RadioButton10.Text = "QSL Info"
Me.RadioButton11.Text = "Name"
Me.RadioButton12.Text = "QTH"
Me.RadioButton13.Text = "Remarks1"
Me.RadioButton14.Text = "Remarks2"
Me.RadioButton15.Text = "全部のデータを送る"
Me.RadioButton16.Text = "入力ウインドウを消去する"

Me.Button1.Text = "HAMLOGから取得"
Me.Button2.Text = "HAMLOGへ送る"
Me.Button3.Text = "閉じる"
Me.Button4.Text = "データクリア"

Me.CheckBox1.Text = "登録確認画面を表示する"
Me.CheckBox2.Text = "登録確認画面を表示せず登録する"

Me.RadioButton15.Checked = True

End Sub

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

Me.TextBox1.Clear()
If Me.RadioButton15.Checked = True Then
Me.TextBox1.Text = ControlChars.NewLine
End If
Me.TextBox1.Focus()
End Sub

Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged

If Me.CheckBox1.Checked = True Then
Me.CheckBox2.Checked = False
End If

End Sub

Private Sub CheckBox2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox2.CheckedChanged

If Me.CheckBox2.Checked = True Then
Me.CheckBox1.Checked = False
End If

End Sub

End Class

*******************************************************************************
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop