C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: CB_FINDSTRINGの使い方(VB.NET)


(過去ログ 129 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■76594 / inTopicNo.1)  CB_FINDSTRINGの使い方(VB.NET)
  
□投稿者/ 初心者 (11回)-(2015/07/27(Mon) 10:52:25)

分類:[.NET 全般] 

AUTOCADのフィルター画面のコンボボックスのハンドル番号を取得し操作しているコードです。

VB5にて動作しているコードをVisual Studio Express2013(以下2013と称す)に移植しました。
実行部分での変更点は、2013で変数wsの前にByValを記述すると文法エラーが発生するので削除しました。
処理したいことは、コンボの項目を検索し見つかったら選択することです。

しかし、2013のCB_FINDSTRINGの処理行で下記のエラーメッセージが表示され処理は中断します。

VBはあまり詳しくなくネットからのコードを利用している状況なのでエラーの対処がちんぷんかんぷんです。

どなたか原因の分かる方お教え願えないでしょうか。
OSはwin7です。コードは抜粋のため分かりずらいかもしれませんが宜しくお願いします。
それと、スローとはどういったことなのでしょうか?

[VB5のコード]
Public Declare Function SendMessage Lib "User32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Const CB_GETLBTEXT = &H148 'コンボボックスのリストボックスから文字列を取得する

ws = "** OR 開始"
Cmbcnt = SendMessage(FILWndCMD, CB_GETCOUNT, 0, 0) 'CombBoxの項目数の取得
retValue = SendMessage(FILWndCMD, CB_FINDSTRING, -1, ByVal ws) '文字列検索ごインデックス取得
retValue = SendMessage(FILWndCMD, CB_SETCURSEL, retValue, 0) '項目の選択



[Visual Studio Express2013のコード]
<System.Runtime.InteropServices.DllImport("user32.dll", CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
Public Function SendMessage( _
ByVal hWnd As Int32, _
ByVal Msg As Int32, _
ByVal wParam As Int32, _
ByRef lParam As Int32) As Long
End Function

Public Const CB_GETLBTEXT = &H148 'コンボボックスのリストボックスから文字列を取得する

ws = "** OR 開始"
Cmbcnt = SendMessage(FILWndCMD, CB_GETCOUNT, 0, 0) 'CombBoxの項目数の取得 これは確認のために実行する
'次の命令にエラーが発生する
retValue = SendMessage(FILWndCMD, CB_FINDSTRING, -1, ws) '文字列検索ごインデックス取得
retValue = SendMessage(FILWndCMD, CB_SETCURSEL, retValue, 0) '項目の選択


[実行時エラーメッセージ]
型'System.InvalidCastException'のハンドルされていない例外がMicrsoft.VisualBasic.dllで発生しました。
追加情報:String "** OR 開始"から型'Integer'への変換は無効です。
□この種類の例外がスローされると中断します
引用返信 編集キー/
■76598 / inTopicNo.2)  Re[1]: CB_FINDSTRINGの使い方(VB.NET)
□投稿者/ 774RR (280回)-(2015/07/27(Mon) 11:28:32)
えっと・・・詳しくないのに InteropService 使う羽目になっているわけですね・・・
ご愁傷様というかなんと言うか・・・

> それと、スローとはどういったことなのでしょうか?
例外が投げられる (throw exception) と覚えてくれると良いっす。
投げる(throw) と 捕捉する(catch) がペア。
・例外=実行時の失敗
・例外がスローされる=失敗が実際に発生する
・例外をキャッチする=失敗に対処する

Win32 の SendMessage の第4引数は LPARAM つまり任意の型を受け付ける仕様
提示 VB5 の コードは As Any で任意の型となっている
提示 VB2013 のコードは As Int32 なので int 型しか取れないのに
ws なる文字列を渡そうとしているので String→Integer の変換を行おうとして失敗してる
失敗が例外となって投げられているが、誰も捕捉してないのでエラー終了してる。

結論から言うと第4引数が String(Builder) / UnmanagedType.LPTStr な別バージョンの SendMessage を
作ればよいっす。変換が発生しなくなるので例外も発生しません。

引用返信 編集キー/
■76602 / inTopicNo.3)  Re[2]: CB_FINDSTRINGの使い方(VB.NET)
□投稿者/ 初心者 (12回)-(2015/07/27(Mon) 14:50:19)
No76598 (774RR さん) に返信
> えっと・・・詳しくないのに InteropService 使う羽目になっているわけですね・・・
> ご愁傷様というかなんと言うか・・・
そうなんですか〜〜訳わかってないので、お呪いと思って進めています。^○^

>>それと、スローとはどういったことなのでしょうか?
> 例外が投げられる (throw exception) と覚えてくれると良いっす。
> 投げる(throw) と 捕捉する(catch) がペア。
> ・例外=実行時の失敗
> ・例外がスローされる=失敗が実際に発生する
> ・例外をキャッチする=失敗に対処する
なるほどですね。ありがとうございます。

> Win32 の SendMessage の第4引数は LPARAM つまり任意の型を受け付ける仕様
> 提示 VB5 の コードは As Any で任意の型となっている
> 提示 VB2013 のコードは As Int32 なので int 型しか取れないのに
> ws なる文字列を渡そうとしているので String→Integer の変換を行おうとして失敗してる
> 失敗が例外となって投げられているが、誰も捕捉してないのでエラー終了してる。
>
> 結論から言うと第4引数が String(Builder) / UnmanagedType.LPTStr な別バージョンの SendMessage を
> 作ればよいっす。変換が発生しなくなるので例外も発生しません。

Stringタイプを作成したらOKでした。気分すっきりです。
ちょっとしたことなのだけど、嵌ると抜け出せなく困ります。感謝します。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -