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 しても見ましたが、だめです。
どうすれば、動作するようになりますか??
よろしくお願いします。
わからないので、破れかぶれということで
早い話、メモリ並びがあっていれば良いのでしょう??
と思い込みやってみたら動作したのでいいかな〜
'<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もあるのではないので
アホはアホなりの作戦でやるしかない。
残念!!
この辺の情報でわかりやすいものがありましたら教えてください。
> 記載してあるヘルプも読みましたし、ネットなども探しましたが
> わかりません。
何が分からないのか、良く分からないのですが・・・
Upgradeコメントが2つ出てますよね・・・
先ず、
> 'UPGRADE_TODO: この構造体のインスタンスを初期化するには、"Initialize" を呼び出さなければなりません。
これから、「初期化するには『Initialize』を呼べば良さそう」なのは推測できると思います。
また、
> 'UPGRADE_WARNING: 構造体 JC の配列は、使用する前に初期化する必要があります。
これから、「変数『JC』を初期化しなければならないんだな」と言うのも推測できると思います。
となれば、組み合わせて、
「『JS.Initialize()』を実行すれば良さそう」となりそうですが・・・
ご返事が来ました。ありがとうございます。
どうしてこうなってあーなって、説明するのが難しいのですが、
<「『JS.Initialize()』を実行すれば良さそう」となりそうですが・・・
そうすると
warning BC42109: 変数 'JC' は、値が割り当てられる前に参照によって使用されています。Null 参照の例外が実行時に発生する可能性があります。構造体、またはすべての参照メンバが使用前に初期化されていることを確認してください。
え、初期化しようと思うのに初期化できない???
なんです。
> warning BC42109: 変数 'JC' は、〜実行時に発生する可能性があります〜確認してください。
これって、只の警告・・・「確認」して大丈夫なら、問題無いのでは・・・
どうしても気になるなら、
--------------------------------
Dim JC As New JOYCAPS
JC.Initialize()
--------------------------------
と書けば警告は出なくなりますけど・・・
ありがとうございます。非常にうれしいです。
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
偶然ググったらこのページにたどり着きました。
私もこのソフトを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
> If joyGetDevCaps(JoyID, JC, test) > 0 Then JoyID = -2 : Exit Sub
の第3引数の「test」って何を設定しています?
#がんばる君さんのコードと書き方が違いますが・・・
#この設定を間違っているのでは?
すいません。
testのところはちょっと色々弄ってみて直してなかったコードです。
今はがんばく君さんと同じ Len(JC) を使っています。
誤解を招いてしまいすみませんでした。
ツイート | ![]() |