VB6のジョイパッドソフトをVBNETで動かすには?

解決


がんばる君  2007-07-03 01:13:23  No: 143725

VB6のジョイパッドソフトをVBNET2005で変換しましたが、エラーでて
動作しません。

トータル2週間奮闘しましたが、完敗、白旗状態です。
VB6で完動品です。フリーソフトであったものです。

以下はVBNET2005の抜粋ですが

   'ゲームコントローラの情報を取得するAPI
    'UPGRADE_WARNING: 構造体 JOYCAPS に、この Declare ステートメントの引数としてマーシャリング属性を渡す必要があります。 詳細については、'ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?keyword="C429C3A5-5D47-4CD9-8F51-74A1616405DC"' をクリックしてください。
    Private Declare Function joyGetDevCaps Lib "winmm.dll" Alias "joyGetDevCapsA" (ByVal ID As Integer, ByRef lpCaps As JOYCAPS, ByVal uSize As Integer) As Integer
    'JOYCAPS構造体
    Structure JOYCAPS
        Dim wMid As Short
        Dim wPid As Short
        <VBFixedArray(31)> Dim szPname() As Byte
        Dim wXmin As Integer
        Dim wXmax As Integer
        Dim wYmin As Integer
        Dim wYmax As Integer
        Dim wZmin As Integer
        Dim wZmax As Integer
        Dim wNumButtons As Integer
        Dim wPeriodMin As Integer
        Dim wPeriodMax As Integer
        Dim wRmin As Integer
        Dim wRmax As Integer
        Dim wUmin As Integer
        Dim wUmax As Integer
        Dim wVmin As Integer
        Dim wVmax As Integer
        Dim wCaps As Integer
        Dim wMaxAxes As Integer
        Dim wNumAxes As Integer
        Dim wMaxButtons As Integer
        <VBFixedArray(31)> Dim szRegKey() As Byte
        <VBFixedArray(259)> Dim szOEMVxD() As Byte

        'UPGRADE_TODO: この構造体のインスタンスを初期化するには、"Initialize" を呼び出さなければなりません。 詳細については、'ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?keyword="B4BFF9E0-8631-45CF-910E-62AB3970F27B"' をクリックしてください。
        Public Sub Initialize()
            ReDim szPname(31)
            ReDim szRegKey(31)
            ReDim szOEMVxD(259)
        End Sub
    End Structure

        Dim JI As JoyInfo
        'UPGRADE_WARNING: 構造体 JC の配列は、使用する前に初期化する必要があります。 詳細については、'ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?keyword="814DF224-76BD-4BB4-BFFB-EA359CB9FC48"' をクリックしてください。
        Dim JC As JOYCAPS
 
        Dim p As Integer
        Dim i As Integer

        JoyID = -1 'とりあえず、-1をセット

        'ポート数を取得
        p = joyGetNumDevs()
        If p = 0 Then Exit Sub 'ポート数が 0 なら抜ける

        'コントローラIDを順に調べる
        '接続されているIDが見つかったら、JoyID にセットしてループを抜ける
        For i = 0 To p - 1
            If joyGetPos(i, JI) = 0 Then JoyID = i : Exit For
        Next i

        '接続されているIDが見つからなかったら抜ける
        If JoyID = -1 Then Exit Sub

        'ゲームコントローラの情報を取得
        '万一エラーが起きたら、JoyID に -2をセットして抜ける
        'Initialize()

        '2007/06どうしてもここから進みません
        If joyGetDevCaps(JoyID, JC, Len(JC)) > 0 Then JoyID = -2 : Exit Sub

記載してあるヘルプも読みましたし、ネットなども探しましたが
わかりません。

適当ですが  Dim JC As New JOYCAPS  しても見ましたが、だめです。
どうすれば、動作するようになりますか??
よろしくお願いします。


かんばる君  2007-07-07 00:03:44  No: 143726

わからないので、破れかぶれということで
早い話、メモリ並びがあっていれば良いのでしょう??
と思い込みやってみたら動作したのでいいかな〜

'<VBFixedArray(31)> Dim szPname() As Byte
これを
dim p0 as byte
dim p1 as byte
dim p2 as byte
dim p3 as byte
dim p4 as byte
    .
    .
    .
    .
dim p31 as byte

 省略

'<VBFixedArray(31)> Dim szRegKey() As Byte
dim r0 as byte
    .
    .
dim r31 as byte

'<VBFixedArray(259)> Dim szOEMVxD() As Byte
dim o0 as byte
    .
    .
dim o259 as byte
書いていてかなりのアホだなと思いましたが、
メモリ割付が1000も2000もあるのではないので
アホはアホなりの作戦でやるしかない。
残念!!
この辺の情報でわかりやすいものがありましたら教えてください。


大吉末吉  2007-07-08 22:30:32  No: 143727

> 記載してあるヘルプも読みましたし、ネットなども探しましたが
> わかりません。

何が分からないのか、良く分からないのですが・・・

Upgradeコメントが2つ出てますよね・・・

先ず、
>         'UPGRADE_TODO: この構造体のインスタンスを初期化するには、"Initialize" を呼び出さなければなりません。

これから、「初期化するには『Initialize』を呼べば良さそう」なのは推測できると思います。

また、
>  'UPGRADE_WARNING: 構造体 JC の配列は、使用する前に初期化する必要があります。

これから、「変数『JC』を初期化しなければならないんだな」と言うのも推測できると思います。

となれば、組み合わせて、

 「『JS.Initialize()』を実行すれば良さそう」となりそうですが・・・


がんばる君  2007-07-11 22:47:27  No: 143728

ご返事が来ました。ありがとうございます。
どうしてこうなってあーなって、説明するのが難しいのですが、

<「『JS.Initialize()』を実行すれば良さそう」となりそうですが・・・
そうすると
warning BC42109: 変数 'JC' は、値が割り当てられる前に参照によって使用されています。Null 参照の例外が実行時に発生する可能性があります。構造体、またはすべての参照メンバが使用前に初期化されていることを確認してください。

え、初期化しようと思うのに初期化できない???
なんです。


大吉末吉  2007-07-12 16:21:05  No: 143729

> warning BC42109: 変数 'JC' は、〜実行時に発生する可能性があります〜確認してください。

これって、只の警告・・・「確認」して大丈夫なら、問題無いのでは・・・

どうしても気になるなら、
--------------------------------
        Dim JC As New JOYCAPS
        JC.Initialize()
--------------------------------
と書けば警告は出なくなりますけど・・・


がんばる君  2007-07-17 22:19:32  No: 143730

ありがとうございます。非常にうれしいです。
     Dim JC As New JOYCAPS
     JC.Initialize()
たしかにエラーも消えてコンパイルできて実行すると

下記の行でEXITしてしまうのです。
私には難しすぎるかもしれません。

   'コントローラIDを順に調べる
        '接続されているIDが見つかったら、JoyID にセットしてループを抜      ける
        For i = 0 To p - 1
            If joyGetPos(i, JI) = 0 Then JoyID = i : Exit For
        Next i

この辺の関数をオーバーロードするとだめですか??
(オーバーロードの意味もよく分かっていない)
フィーリングです。
Private Declare Function joyGetDevCaps Lib "winmm.dll" Alias "joyGetDevCapsA" (ByVal ID As Integer, ByRef lpCaps As JOYCAPS, ByVal uSize As Integer) As Integer


すいはんき  2007-08-25 10:18:22  No: 143731

偶然ググったらこのページにたどり着きました。
私もこのソフトをVS2005でアップデートして、同じような問題が発生しています。

私もなんとか
  JC = New JOYCAPS()
  JC.Initialize()

の件はクリア出来たんですが今度は
If joyGetDevCaps(JoyID, JC, test) > 0 Then JoyID = -2 : Exit Sub
の行で
追加情報: 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。
と止まってしまいます。

使用しているジョイステックはプレステ2のコントローラをBAFFAROのBGC-UPS201/SVを使用して使っています。

一応関係ないと思いますが環境も乗せておきます。
使用環境
OS:WinXP Pro
soft:VS2005Pro


大吉末吉  2007-08-25 13:51:31  No: 143732

> If joyGetDevCaps(JoyID, JC, test) > 0 Then JoyID = -2 : Exit Sub

の第3引数の「test」って何を設定しています?

#がんばる君さんのコードと書き方が違いますが・・・
#この設定を間違っているのでは?


すいはんき  2007-08-26 00:54:39  No: 143733

すいません。
testのところはちょっと色々弄ってみて直してなかったコードです。
今はがんばく君さんと同じ Len(JC) を使っています。
誤解を招いてしまいすみませんでした。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加