重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【終了しました】教えて!gooアプリ版

OS:Windows Server 2003
開発言語:visual basic 2005

vb6で作られたアプリを.net2005に移行しています。

その中で、下記のコードの「GetModuleBaseName」が呼び出される箇所がエラーになり、移行することができません。

-----------------------------------
【コード】
If EnumProcessModules(hProcess, hModules(0), UBound(hModules), lNeeded) <> 0 Then
   'モジュール数を取得する
   lModules = lNeeded / 4
   'モジュールベース名を取得する
   lRetValue = GetModuleBaseName(hProcess, hModules(0), tModuleBaseName(0), UBound(tModuleBaseName))
   ~~~
   ~~~
end if
-----------------------------------
【エラー内容】
AcccessViolationExceptionはハンドルされませんでした。
保護されているメモリに読み取りまたは書き込み操作を行おうとしました。
他のメモリが壊れていることが考えられます。
-----------------------------------


「GetModuleBaseName」自体は下記のとおり定義しています。
-----------------------------------
Declare Function GetModuleBaseName Lib "Psapi.dll" Alias "GetModuleBaseNameA" (ByVal hProcess As Integer, ByVal hModule As Integer, ByRef lpBaseName As String, ByRef nSize As Integer) As Integer
-----------------------------------

移行前のvb6のアプリでこの箇所がエラーなく通ることを確認しました。

Psapi.dllの使用方法がWindowsServer2003になって変更になったのでしょうか?
使用方法が変更になったのか調べたのですが、WinAPIの知識不足で・・・。

お力をお貸しください。
よろしくお願いいたします。

A 回答 (1件)

GetModuleBaseNameのlpBaseName引数には文字列を確保しておいてから呼び出すように思います


その確保したサイズがnSizeだろうと思います
nSizeは単なるDWORDなのでByRefではなくByValなように思いますよ

VB6でしたら
dim ss as String * 256
といった固定長文字列を使うか
dim ss as string
ss = Space(256)
といった具合で確保してから呼び出すのでしょう

VB.NETの場合は 固定長文字列の宣言はVBFixedString属性をしてしない場合は出来なくなっています
<VBFixedString(256)>dim ss as String
といった具合に宣言するのだろうと思います
固定長文字列でないなら StringBuilderクラスを使うといいのかもしれません
    • good
    • 0
この回答へのお礼

ありがとうございました。

ByRef→Byvalで無事に通ることができました。

元々のVB6のソースが、
 ByRef As Any
だったもので、
 As Any → As String
と修正しただけだったのです。

本当にありがとうございました。

お礼日時:2007/12/10 12:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!