2017年11月17日金曜日

変数の型宣言(int,long)


VB6.0とVB.NETの型変換表

よく勘違いしてしまうので注意。
Visual Basic 6.0Visual Basic .NETC#
16 ビットIntegerShortshort
32 ビットLongIntegerint
64 ビット(none)LongLong

2017年11月7日火曜日

hDCプロパティの変換

VB6.0にてグラフィック関連の処理をしている際に「.hDCプロパティ」を使用している

これをVB.NETに変換すると
「error BC30456: 'hdc' は ’Form1' のメンバではありません。」
とビルド時にエラーになってしまう。

たとえばアイコン描画で下記関数を使用する場合
Public Declare Function DrawIcon Lib "user32" (ByVal hdc As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal hIcon As Integer) As Integer

Me.hdcでエラーとなる
-----------------------------------------------------------------------
       Call DrawIcon(Me.hdc, 10, 10, hIcon)
-----------------------------------------------------------------------
下記のように変換すると使用できる
-----------------------------------------------------------------------
        Dim gra As Graphics = Me.CreateGraphics
        Dim hdc As IntPtr = gra.GetHdc()
        Call DrawIcon(hdc, 10, 10, hIcon)
-----------------------------------------------------------------------

2017年11月2日木曜日

DLLのCallbackアドレス渡し(error BC30581)

error BC30581 'Integer' は、デリゲート型でないため、'AddressOf' 式を 'Integer' に変換できません。

原因としては
VB6.0でDLLにCallback関数のアドレスを「Address Of 関数名」で渡していたものが
.NET変換後 では 「AddressOf」が使用できずに上記エラーとなってしまう。

エラーの回避方法
下記のようにdelegate型の変数を作成し,それを渡すことで解決できる

.NET変換直後(修正前)
-------------------------------------------------------------------------------------------
(DLL関数宣言部)
Public Declare Function DllMethod Lib "xxx.DLL" (ByVal handle As Integer, ByVal callback As Integer) As Integer

(DLL関数呼び出し部)
Call DllMethod(handle, AddressOf callbackproc)
'DllMethod:DLL関数名
'callbackproc:Callback関数名

(Callback関数部)
Public Function callbackproc(ByVal id As Integer, ByVal msg As Integer) As Integer
   '処理内容 ・・・
End Function
-------------------------------------------------------------------------------------------

修正後(修正個所赤文字)
-------------------------------------------------------------------------------------------
(DLL関数宣言部)
Public Declare Function DllMethod Lib "xxx.DLL" (ByVal handle As Integer, ByVal callback As CallbackDelegate) As Integer

(DLL関数呼び出し部)
Call DllMethod(handle, New CallBackDelegate (AddressOf callbackproc) )
'DllMethod:DLL関数名
'callbackproc:Callback関数名

(Callback関数部)
Public Function callbackproc(ByVal id As Integer, ByVal msg As Integer) As Integer
   '処理内容 ・・・
End Function

(Delegate宣言部)
public Delegate Sub CallBackDelegate (ByVal id As Integer, ByVal msg As Integer) 

-------------------------------------------------------------------------------------------



構造体のサイズ

VB6ではLenB(構造体)とするとサイズが取得できていましたが
VB.NETではLenBも使用できないため,
構造体のサイズを取得する書き方に修正が必要です。

まずインポート文を追加
Imports System.Runtime.InteropServices

そして
Marshal.SizeOf(構造体)

でサイズが取得できます。

また,StructLayout属性を使用することで
サイズの取得方法などを変更できます。



2017年10月31日火曜日

LenB は宣言されていません

LenB関数は.NETでは使用できないため

下記関数を追加することで解決できる

--------------------------------------------------------------------------------------------
Public Function LenB(ByVal str As String) As Integer
    Return System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(str)
End Function
--------------------------------------------------------------------------------------------

2017年10月30日月曜日

コメントの注意点

VB6.0にて「’’’」(シングルコーテーションを3つ)でコメントしていると
変換時にVB.NETではXMLのコメントとして認識しようとしてしまうため
ビルド時にエラーとなる。

対応策
VB6.0でのコメントで「’’’」等シングルコーテーションが3つ以上のものは
「’」(シングルコーテーション1つ)に変更してから.NETへの変換が好ましい

2017年10月26日木曜日

はじめに

このブログは
VB6.0からVB.NETへのマイグレーションについてのメモ
になります。

microsoftのアップグレードツールを使用して出力されたエラーや
ビルドエラーについての対応方法をメモしていきます。