最速怪談選手権

VB6で画像処理アプリケーションの開発を行っている者です。
下記記述でワーキングセット領域を変更しようとしていますが、GetProcessWorkingSetSizeの部分でエラーが発生します。
使用PCにより、「問題が発生したため、Visual Basic を終了します。 ご不便をおかけして申し訳ありません。」や有無を言わさず開発環境が終了してしまう場合がありますが、いずれにしても原因が分かりません。
どなたかアドバイスいただけませんでしょうか?
よろしくお願い致します。

(標準モジュールで宣言)
Declare Function GetCurrentProcessId Lib "kernel32.dll" () As Long

Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long

Declare Function GetProcessWorkingSetSize Lib "kernel32" (ByVal qq As Integer, ByVal pp As Integer, ByVal rr As Integer) As Long

Declare Function SetProcessWorkingSetSize Lib "kernel32" (ByVal phph1 As Long, ByVal wkminwkmin1 As Long, ByVal wkmaxwkmax1 As Long) As Long

Declare Function GetLastError Lib "kernel32.dll" () As Long

(実行部)
Sub WorkingSetChange()

Dim id As Long 'アプリケーションプログラムのID用変数
Dim ph As Long 'アプリケーションプログラムのハンドル用変数
Dim wkmin As Long '最小ワーキングセット用変数
Dim wkmax As Long '最大ワーキングセット用変数
Dim bret As Long

Const PROCESS_SET_QUOTA = &H100
Const PROCESS_QUERY_INFORMATION = &H400

'アプリケーションプログラムのIDを取得する
id = GetCurrentProcessId()

'アプリケーションプログラムのハンドルをオープンする
ph = OpenProcess(PROCESS_SET_QUOTA + PROCESS_QUERY_INFORMATION, False, id)

'アプリケーションプログラムの最大ワーキングセット値と最小ワーキングセット値を取得
bret = GetProcessWorkingSetSize(ph, wkmin, wkmax)

'最小ワーキングセット値を1MBに設定
wkmin = 1 * 1024 * 1024

'最大ワーキングセット値を3MBに設定
wkmax = 3 * 1024 * 1024

'アプリケーションプログラムの最大ワーキングセット値と最小ワーキングセット値を変更
bret = SetProcessWorkingSetSize(ph, wkmin, wkmax)

'アプリケーションプログラムのハンドルをクローズする
bret = CloseHandle(ph)

End Sub

A 回答 (1件)

>使用PCにより、「問題が発生したため、Visual Basic を終了します。

ご不便をおかけして申し訳ありません。」や有無を言わさず開発環境が終了してしまう場合がありますが、いずれにしても原因が分かりません。

環境による…のですから、まずはその環境の差異を確認されては?

http://msdn.microsoft.com/ja-jp/library/cc429141 …
によると、Win9x系では動作しない可能性がありそうですが…。
# kernel32.dllにGetProcessWorkingSetSize()がエクスポートされていない。
# エクスポートされているが中身は何もしない(例外を発生させるだけ)な子動作になっている。とか…。

VBではよくわかりませんが、変数のアドレスが正しく渡せていない…とか。
http://www.google.co.jp/search?hl=ja&num=30&q=VB …
# 適当に検索。
# Declare Function GetProcessWorkingSetSize Lib "kernel32" (ByVal qq As Integer, 【ByVal】 pp As Integer, 【ByVal】 rr As Integer) As Long
# ではアドレス渡せていないような気がするのは気のせいでしょうか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ご指摘の通り、【ByVal】を【Byref】に変更すると、ご質問したような問題が発生しなくなりました。ただ、型が違いますとのエラーが発生したため、As Integerを Longに変更したところ、動作致しました。
朝から半日悩んでおりましたので大変助かりました。本当にありがとうございました。

お礼日時:2009/04/29 14:53

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