HAMLOG プログラム開発室


新着表示
タイトル
記事No
投稿日
投稿者
参照先
Re: THW_updateについて
150
2009/08/10(Mon) 14:42:57
JO1SIM 出島

ちょっと調べたところ、VB.NET(2008)とDLLの間では、マネージドコードとアンマネージドコードの間でデータの受け渡しをするための宣言が必要ではないかという情報がありました。HAMLOG50.BASの中にある宣言を変える必要があるかもしれません。

自信は全然ありませんが、読み込み部分と更新部分の関数を書き換えるとすると…

Declare Function THW_read Lib "Hamlog50.dll" ( _
h As TThLog, _
ByVal n As Long, ByVal i As Long) As Long

Declare Function THW_update Lib "Hamlog50.dll" ( _
Th As TThLog, _
Th2 As TThLog, _
ByVal r As Long, ByVal f As Long, m As Long) As Long

問う風にでもなるでしょうか?LPStructの辺が違うかもしれません。

いずれにしても、VB.NETの世界とDLLの世界のやり取りを行うための仕組みが何かしら必要だと思います。VB.NETに合わせて、THDLL2VB.DLLに当たる部分を作り直していただければなぁと思います。>作者様



> JO1SIM 出島さん、ありがとうございます。
>
> > rd = THW_read(u_th, u_Rno, 0)
> > rd = THW_read(u_th2, u_Rno, 0)
> > という風に変数間のコピーではなく、2回呼び出してみてはいかがでしょうか?
>
> この事は書かなかったのですが、すでにテスト済みでした。 SRI
> 改めて試しましたが結果は変化無しでした。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: THW_updateについて
149
2009/08/10(Mon) 12:52:12
JA2BQX 太田
JO1SIM 出島さん、ありがとうございます。

> rd = THW_read(u_th, u_Rno, 0)
> rd = THW_read(u_th2, u_Rno, 0)
> という風に変数間のコピーではなく、2回呼び出してみてはいかがでしょうか?

この事は書かなかったのですが、すでにテスト済みでした。 SRI
改めて試しましたが結果は変化無しでした。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: THW_updateについて
148
2009/08/10(Mon) 12:25:25
JO1SIM 出島

太田さん
ヒントありがとうございます。

TQsoBuffのHis以降は実体ではなくてポインタが格納されていることになっているようですね。となると、u_th2にコピーしたのはu_thの中身ではなく、ポインタをコピーしていることになり、事実上、変更後のデータの参照先を一緒にコピーしていることになります。

THW_readの中身がわからないのでちょっと不安ですが…

rd = THW_read(u_th, u_Rno, 0)
rd = THW_read(u_th2, u_Rno, 0)

という風に変数間のコピーではなく、2回呼び出してみてはいかがでしょうか?



> こんにちは。
>
> > th2 = th ではダメなんでしょうか?(笑)
>
> これもすでに試してはいますが結果は同じでした。
>
> その後のテストで Code 、 G/L 、 QSLは変わります。
>
> HAMLOG50.H の中身を見ています。下記を見ると
>
> WORD
> Flag1; ..以下が変わらない項目と合います。
> THW5になってから項目の桁数を変更出来るようになりました。
>
> VB以外は分からないので、ここから先に手が付きません。
>
> 改行制御が上手く出来ていない投稿で冗長で済みません。
>
> typedef
> struct
>
>
> {char
> Calls[21],
>
>
>
> Date[9],
> //
> 04/08/20
>
>
>
> Time[7],
> //
> 10:20J
>
>
>
> Code[7],
>
>
>
> Glid[7],
>
>
>
> Qsl[4];
>
> //
> Qsl, Send, Rcv ここまでで57バイト
>
> WORD
> Flag1;
>
> char
> Hiss[764];
> //
> 13
>
> char
> *Myrs,
>
> //
> 13
>
>
>
> *Freq,
>
> //
> 17
>
>
>
> *Mode,
>
> //
> 17
>
>
>
> *Name,
>
> //
> 65
>
>
>
> *Qth,
>
> //
> 129
>
>
>
> *Rmk1,
>
> //
> 255
>
>
>
> *Rmk2;
>
> //
> 255
>
> BYTE
> HissLen, MyrsLen, FreqLen, ModeLen, NameLen, QthLen, Rmk1Len, Rmk
> 2Len;}
>
> TQsoBuff;
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: THW_updateについてお教えください
147
2009/08/10(Mon) 11:44:23
JO1SIM 出島

吉田さん
おはようござます。

Byte()に変更しても同じだったのですね。
THDLL2VB.DLL側には問題ないということみたいですね…。

あと確認するとしたら、データのコピーのあたりですかねぇ。

> JO1SIM 出島さん、おはようございます。
>
> 同じデータをUpdateではなくAppendで追加するときは、正常に追加できます。
>
> > UpdateQsoDataはByte()で定義して…
> >
> > bytesData = System.Text.Encoding.GetEncoding(932).GetBytes(u_DataTbl(d))
> > ' 932はShift_JISの意味
> >
> > のようにして、ShiftJISのバイト列に変換してSetThBufferに与えてみてはいかがでし>>ょうか?
>
> 試みに、SetThBufferの定義部分の第二引数をバイト配列型に変更して
>
> Dim UpdateQsoData As Byte()
>
> For d As Integer = 0 To 14
> UpdateQsoData = System.Text.Encoding.GetEncoding(932).GetBytes(u_DataTbl(d))
> SetThBuffer(u_th, UpdateQsoData, d)
> Next
>
> としてShiftJISのバイト列に変換してSetThBufferに与えてみとしましたが、結果はstring型の場合と同じで、修正できるデータ項目と修正できないデータ項目はまったく同一でした。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: THW_updateについて
146
2009/08/10(Mon) 11:39:57
JA2BQX 太田
こんにちは。

> th2 = th ではダメなんでしょうか?(笑)

これもすでに試してはいますが結果は同じでした。

その後のテストで Code 、 G/L 、 QSLは変わります。

HAMLOG50.H の中身を見ています。下記を見ると

WORD
Flag1; ..以下が変わらない項目と合います。
THW5になってから項目の桁数を変更出来るようになりました。

VB以外は分からないので、ここから先に手が付きません。

改行制御が上手く出来ていない投稿で冗長で済みません。

typedef
struct


{char
Calls[21],



Date[9],
//
04/08/20



Time[7],
//
10:20J



Code[7],



Glid[7],



Qsl[4];

//
Qsl, Send, Rcv ここまでで57バイト

WORD
Flag1;

char
Hiss[764];
//
13

char
*Myrs,

//
13



*Freq,

//
17



*Mode,

//
17



*Name,

//
65



*Qth,

//
129



*Rmk1,

//
255



*Rmk2;

//
255

BYTE
HissLen, MyrsLen, FreqLen, ModeLen, NameLen, QthLen, Rmk1Len, Rmk
2Len;}

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

Re: THW_updateについてお教えください
145
2009/08/10(Mon) 11:19:53
JA1RNR 吉田康太郎
JO1SIM 出島さん、おはようございます。

同じデータをUpdateではなくAppendで追加するときは、正常に追加できます。

> UpdateQsoDataはByte()で定義して…
>
> bytesData = System.Text.Encoding.GetEncoding(932).GetBytes(u_DataTbl(d))
> ' 932はShift_JISの意味
>
> のようにして、ShiftJISのバイト列に変換してSetThBufferに与えてみてはいかがでし>>ょうか?

試みに、SetThBufferの定義部分の第二引数をバイト配列型に変更して

Dim UpdateQsoData As Byte()

For d As Integer = 0 To 14
UpdateQsoData = System.Text.Encoding.GetEncoding(932).GetBytes(u_DataTbl(d))
SetThBuffer(u_th, UpdateQsoData, d)
Next

としてShiftJISのバイト列に変換してSetThBufferに与えてみとしましたが、結果はstring型の場合と同じで、修正できるデータ項目と修正できないデータ項目はまったく同一でした。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: THW_updateについて
144
2009/08/10(Mon) 10:48:29
JO1SIM 出島

Appendがうまくいっているということは、Updateに特有の不具合ということになりますね…。

比較用データがちゃんとコピーされているかどうかを見るには、thとth2の両方をAppendしてみて、th2にコピーがちゃんとされているかをご覧になってはいかがでしょうか?

> th2.Qso = th.Qso ' 修正前のデータを格納

th2 = th ではダメなんでしょうか?(笑)

コピー動作がうまくいっていることを確認するには、th、th2とも完全にクリアしておいたほうがいいと思います。(Space等で埋める)

> ...に対処するのが Hamlog50.DLLとThdll2Vb.dll だと思っていますがまだ解決には至りません。

thdll2bv.dllのソースを見たところ、ThwStringとSetThBufferはHamlog50.dllを呼び出していませんでした。VB2008側の問題であるならですが、本関数を使わずにVBで代わりの操作が必要になるかもしれません。






> Call , Date , Time , His を変更した場合には「データを登録してよろしいですか?」の確認 MessageBox が表示されますが、
> My から Remarks2 のみを変更した場合には確認 MessageBox が表示されません。
> 内容が変更されたと判断されない....??
>
> HAMLOG50.txt の THW_update の説明に
> Th2
> 比較用のTurbo HAMLOGデータアクセス構造体。あらかじめ変更前のTh の内容をコピーしておく...とありますが
> 上手くコピーされていないと言うことなのでしょうか?
>
> th2.Qso = th.Qso ' 修正前のデータを格納
> ....実行後のth2の内容を Call ThwString を使い確認するとOKと思うのですが。
>
> JO1SIM 出島さんの
>
> > SetThBufferに与えるUpdateQsoDataがString型なのですが、受けとる側では const char *のようなので、
> > この辺で不一致が生じているかもしれません。
>
> ...に対処するのが Hamlog50.DLLとThdll2Vb.dll だと思っていますがまだ解決には至りません。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: THW_updateについて
143
2009/08/10(Mon) 09:10:44
JA2BQX 太田
Call , Date , Time , His を変更した場合には「データを登録してよろしいですか?」の確認 MessageBox が表示されますが、
My から Remarks2 のみを変更した場合には確認 MessageBox が表示されません。
内容が変更されたと判断されない....??

HAMLOG50.txt の THW_update の説明に
Th2
比較用のTurbo HAMLOGデータアクセス構造体。あらかじめ変更前のTh の内容をコピーしておく...とありますが
上手くコピーされていないと言うことなのでしょうか?

th2.Qso = th.Qso ' 修正前のデータを格納
....実行後のth2の内容を Call ThwString を使い確認するとOKと思うのですが。

JO1SIM 出島さんの

> SetThBufferに与えるUpdateQsoDataがString型なのですが、受けとる側では const char *のようなので、
> この辺で不一致が生じているかもしれません。

...に対処するのが Hamlog50.DLLとThdll2Vb.dll だと思っていますがまだ解決には至りません。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: THW_updateについて
142
2009/08/10(Mon) 08:44:26
JA2BQX 太田
みなさんこんにちは。

> 同じデータでUpdateではなくAppendで追加したらどうなるでしょうか?

吉田さんのコードを流用して THW_Append のテストをして見ました。
全項目が反映されたQSOデータが追加されますので SetThBuffer の
使い方に関しては問題無いように思えるのですが、今のところ
THW_update ではHisまでは書き換わりますが、My以降が変わらないです。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: THW_updateについてお教えください
141
2009/08/10(Mon) 02:48:31
JO1SIM 出島

補足です…

SetThBufferに与えるUpdateQsoDataがString型なのですが、受けとる側では const char *のようなので、この辺で不一致が生じているかもしれません。

UpdateQsoDataはByte()で定義して…

bytesData = System.Text.Encoding.GetEncoding(932).GetBytes(u_DataTbl(d))
' 932はShift_JISの意味

のようにして、ShiftJISのバイト列に変換してSetThBufferに与えてみてはいかがでしょうか?ただ、これが正しいとなると、読み込み側でも問題が発生していた可能性があるので、上記と逆の作業をしなければならないと思います。(バイト列からStringに変換する)

Stringクラスとバイト列の変換方法は、下記のリンクに乗っていました。

http://dobon.net/vb/dotnet/string/getencoding.html



> 吉田さん
> みなさんこんにちは。
>
> VBで開発してないので良くはわかりませんが…
>
> 同じデータでUpdateではなくAppendで追加したらどうなるでしょうか?
>
> 問題がUpdateの中にあるのか、それとも更新しようとしているデータに有るのか分かるかもしれません。VB6で動いていて2008だとダメとなると、データの構造の違い等に問題があるような気がしますね。
>
> VBとしての言語は良く似てても、動かす仕組みはだいぶ違うはずなので…。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop