質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

3回答

7173閲覧

VB6をC#に変換したい (VB,C#初心者)

dodo-taka

総合スコア14

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2017/03/16 02:45

編集2017/03/17 00:33

###VB6をC#に変換したい

現在、VB6からC#への変換作業を行っています。
C#の前に、VB2005への変換しているのですが、
下記のエラーで行き詰まっています。

この場合、どのような対応を行えば良いのでしょうか。
どなたかご教授お願い致します。

###発生している問題・エラーメッセージ

.lpfn = GetPointer(AddressOf BFFCallback)の箇所で、 「error BC30581: 'Integer' は、デリゲート型でないため、'AddressOf' 式を 'Integer' に変換できません。」

###該当のソースコード

Public Function GetPointer(ByRef lngAddressOf As Integer) As Integer 'コールバック関数のアドレスを返す GetPointer = lngAddressOf End Function
Public Function BFFCallback(ByVal hwnd As Integer, ByVal uMsg As Integer, ByVal lParam As Integer, ByVal lpData As Integer) As Integer 'フォルダを指定のメッセージをダイアログへ送信 If uMsg = BFFM_INITIALIZED Then Call SendMessage(hwnd, BFFM_SETSELECTIONA, True, lpData) End If End Function

###補足情報(言語/FW/ツール等のバージョンなど)
VB6,VB2005/win7 pro 64bit

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

フォルダ選択ダイアログを表示させるWinAPI呼び出しだと思います。

###方法1
ここを参考にBFFCALLBACKをdelegateで宣言して使用する。(.lpfnもBFFCALLBACK型に変更)

###方法2
可能なら、FolderBrowsDialogコントロールに置き換えればいいのではないでしょうか?
こっちのほうが普通に.NETのコードで済みますのでメンテも楽になると思います。

投稿2017/03/16 03:12

turbgraphics200

総合スコア4267

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodo-taka

2017/03/17 00:30

回答ありがとうございます。 方法1のリンク先で 「Microsoft Visual Basic 2005 または Microsoft Visual Basic .NET については、次の資料を参照してください。811004」 を見ようとしましたが、資料が見当たりませんでした。
guest

0

やってることはフォルダ指定ダイアログを表示しているようですね。
turbgraphics200 さんも書かれていますが、C# の標準で使えるコントロールで置き換える方がよいかもしれません。
※ただし「コンピュータ」や「プリンタ」はFolderBrowserDialog コントロールは表示してくれないので、それらを表示したいなら使わざるをえませんが

pinvoke.netを見ると、ほとんどの DLL の宣言が書かれていますから、参考にはなるでしょう。
実際、これがほぼズバリだと思います。

投稿2017/03/16 03:43

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodo-taka

2017/03/17 00:32

回答ありがとうございます。 >これがほぼズバリだと思います。 リンク先全てが答え、という意味なのでしょうか。 申し訳ありませんが、 当方、VB、C#初心者なもので、理解できずにいます・・・。
tacsheaven

2017/03/17 00:40

リンク先をみると、C# のソースコードがあって(sample code)、実際に SHBrowseForFolder を呼び出して表示しているコードがあるのですよ。ですから欲しい情報はそこにある、のです。 ※それをどう消化して自身のものにするかは貴方の頑張り次第です
dodo-taka

2017/03/17 08:34

>※それをどう消化して自身のものにするかは貴方の頑張り次第です 正しくのその通りだと思います。 少し、理解に時間かかりそうですが、参考にさせて頂きます。
guest

0

.NET では生のポインタを int に変換してガンガン使うやり方は制限されています。できないことはありませんが、初心者にはお勧めしません。
コールバックは次のページを参考にしてみてください。

方法: コールバック関数を実装する

追記

リンク先のページは Windows API の EnumWindows を .NET から呼び出すためにポインタをデリゲートにマーシャリングしています。同様のことが SendMessage でもできるでしょう。
詳細は「プラットフォーム呼び出し」「P/Invoke」「.NET マーシャリング」あたりをキーワードに調べてみてください。

さらに追記

シングルスレッドで SendMessage を使う場合は問題ないと思いますが、PostMessage やマルチスレッドの場合にはポインタの寿命にも気を配ってください。.NET ではデリゲートもガベージコレクション対象ですから、肝心な時にコレクトされていることのないように保持しておいてください。

投稿2017/03/16 03:03

編集2017/03/16 03:14
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodo-taka

2017/03/17 00:29

回答ありがとうございます。 申し訳ありません。 VB、C#初心者でして、理解するのに時間が掛かりそうです。
Zuishin

2017/03/17 05:12

結構ハードなところですからね。turbgraphics200 さんのおっしゃった二番目の方法、FolderBrowsDialog を使うのが簡単だと思います。http://dobon.net/vb/dotnet/form/folderdialog.html 一番目の方法は、2008/04/29 と書かれている通り、FolderBrowserDialog が使えなかった時代のものです。それでも最初に紹介されたのは、FolderBrowserDialog よりも柔軟に扱えるからだと思いますが、FolderBrowserDialog で間に合う場合が多いので、まずそちらを検討してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問