・環境
WinXP
VC6.0
SDK32
メモリ:1GB
GlobalAlloc関数でエラーが発生します。
確保しようとしているメモリは100MB程で、GlobalMemoryStatus関数を使ってみると、
300MB程はメモリ残量があります。
一体何が考えられるのでしょうか?
どこかでメモリエラーorスタックオーバーフローが発生しているのでしょうか?
GlobalAlloc直後のGetLastErrorでエラーをチェックしようとしたのですが、
GlobalAllocのヘルプの戻り値の所に何が帰って来るか書いていないので、
どういった値が戻ってくるのか分かりません。
どう調べたらよいのでしょうか?
私、初心者ですので的を得ていない質問かと思いますが、お知恵を拝借したいと思います。
よろしくお願いします。
GlobalAllocではなくGetLastErrorのヘルプを調べるべきでは?
こういう時はGetLastError関数の方を調べないといけないのでしょうか?
GetLastError関数の方にも何も書いてなく、通常、個々の関数でGetLastErrorで帰って
くるエラーコードの意味を書いてる事が多いと思うのですが、GlobalAllocにはその
記述が無かったので投稿させて頂きました。
GlobalAllocの方に何も書いてなければ、GetLastErrorの方を調べる
しかないのでは、という意味で書きました。
GetLastErrorのヘルプには、
> 解説
> システムエラーコードに対応するエラー文字列を取得するには、
> FormatMessage 関数を使います。エラーコードの詳細なリスト
> については、「Error Codes」を参照してください。
とありますので、GetLastErrorで得られたエラー番号をもとに、
そこを参照すれば良いでしょう。
追記
もう少し簡単な方法もあります。
@err,hr
これをウォッチに追加して、目的の関数をステップ実行してください。
GetLastErrorで得られるエラー番号に対する簡単な日本語の説明を
見ることができます。
戻り値の意味がわからなくてもとりあえず
GetLastErrorがどんな値を返すのか調べる価値はあると思う。
エラーコードはOSの改良のたびに都合があって増えたり
使わなくなったりするだろうから書きたくはないよな。
300MB程はメモリ残量があるからといって
100MBのメモリ確保できるとは限らないよ。
>通常、個々の関数でGetLastErrorで帰ってくるエラーコードの意味を書いてる事が多い
と思うのですが
たとえばどのAPIが?
Kerry様
ありがとうございました。
@err,hrの件、試してみます。
No Name様
例えば、FindFirstFile関数とかGlobalUnlock、GlobalUnlock関数等の場合は、
GetLastError関数の戻り値が明記されていたりします。
通常はこういったヘルプの値を使用するワケではないのでしょうか?
それとも、FormatMessage関数を使用する前提で、コード番号がまったく気にしないので
しょうか?
普通の使い方が分からなくて、申し訳ありません。
超初心者様
すいません。確保しようとしているのは100KBです。間違えました。
300MBのうちの100KBを確保しようとして、エラーが帰って来ます。
本当に謎です。
1. GetLastErrの戻り値を一度ここに公開するのもてだと思います。
している人がいるかも知れません。
2. 「FormatMessage」を使って、取得内容を公開するのもてですね。
メッセージを見ると何か過ちに気付くかもしれません。
3. 100KB程度なら「new/delete」使ってもししょうはないと思います。
但し、「GlobalAlloc」を使わなければいけないのなら別です。
ITO様、ご回答ありがとうございました。
GetLastError関数の戻り値は0x06で、
前述の@err,hrで見ると、[ハンドルが無効です]でした。
GlobalAlloco以前にどこかでメモリを壊してるのでしょうか?
どういった場合にこのエラーが発生するのでしょう。
http://www.kumei.ne.jp/c_lang/sdk/sdk_82.htm
参考にどうぞ、
「GlobalAlloc」ぐぐるといろいろ出てるよ。
いろいろな例を参考にして、自分のコードと何処が違うか比べてみるのも手です。
GetLastErr()の戻り値なら
スタートメニューからERR LOOKってツールで調べられますよ
ERRLOOK.EXEってツールがVC++6.0インストールするとついてきます
100KBが取れないってのはなかなか起こりえないと思いますが・・・
ハンドルは、「HANDLE」じゃないです。
「HGLOBAL」です。
確認して下さい。
MSDN参照のこと。
皆さん、ご親切な回答、本当にありがとうございます。
エラーが発生するプログラムはかなりの実績があり、処理するデータや機械によって出た
り出なかったりします。
なかなか考えにくいエラーですが、なんとか頑張ります。
皆さん、いろいろとありがとうございました。
かなり地道な調査の結果、該当処理の前にメモリーエラーが発生していたようです。
本来、GetLastError関数の戻り値を知るにはどうすれば良いのかなっと思って投稿したの
ですが、皆様の熱いご説明に圧倒されました。
本当にありがとうございます。