GlobalAlloc直後のGetLastErrorの戻り値 – プログラミング – Home

通知
すべてクリア

[解決済] GlobalAlloc直後のGetLastErrorの戻り値


ペコ
 ペコ
(@ペコ)
ゲスト
結合: 19年前
投稿: 23
Topic starter  

・環境
WinXP
VC6.0
SDK32
メモリ:1GB

GlobalAlloc関数でエラーが発生します。
確保しようとしているメモリは100MB程で、GlobalMemoryStatus関数を使ってみると、
300MB程はメモリ残量があります。
一体何が考えられるのでしょうか?
どこかでメモリエラーorスタックオーバーフローが発生しているのでしょうか?

GlobalAlloc直後のGetLastErrorでエラーをチェックしようとしたのですが、
GlobalAllocのヘルプの戻り値の所に何が帰って来るか書いていないので、
どういった値が戻ってくるのか分かりません。
どう調べたらよいのでしょうか?

私、初心者ですので的を得ていない質問かと思いますが、お知恵を拝借したいと思います。
よろしくお願いします。


引用未解決
トピックタグ
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 21年前
投稿: 192
 

GlobalAllocではなくGetLastErrorのヘルプを調べるべきでは?


返信引用
ペコ
 ペコ
(@ペコ)
ゲスト
結合: 19年前
投稿: 23
Topic starter  

こういう時はGetLastError関数の方を調べないといけないのでしょうか?
GetLastError関数の方にも何も書いてなく、通常、個々の関数でGetLastErrorで帰って
くるエラーコードの意味を書いてる事が多いと思うのですが、GlobalAllocにはその
記述が無かったので投稿させて頂きました。


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 21年前
投稿: 192
 

GlobalAllocの方に何も書いてなければ、GetLastErrorの方を調べる
しかないのでは、という意味で書きました。

GetLastErrorのヘルプには、

> 解説
> システムエラーコードに対応するエラー文字列を取得するには、
> FormatMessage 関数を使います。エラーコードの詳細なリスト
> については、「Error Codes」を参照してください。

とありますので、GetLastErrorで得られたエラー番号をもとに、
そこを参照すれば良いでしょう。

追記

もう少し簡単な方法もあります。

@err,hr

これをウォッチに追加して、目的の関数をステップ実行してください。
GetLastErrorで得られるエラー番号に対する簡単な日本語の説明を
見ることができます。


返信引用
超初心者
 超初心者
(@超初心者)
ゲスト
結合: 24年前
投稿: 139
 

戻り値の意味がわからなくてもとりあえず
GetLastErrorがどんな値を返すのか調べる価値はあると思う。

エラーコードはOSの改良のたびに都合があって増えたり
使わなくなったりするだろうから書きたくはないよな。

300MB程はメモリ残量があるからといって
100MBのメモリ確保できるとは限らないよ。


返信引用
NoName
 NoName
(@NoName)
ゲスト
結合: 19年前
投稿: 3
 

>通常、個々の関数でGetLastErrorで帰ってくるエラーコードの意味を書いてる事が多い
と思うのですが
たとえばどのAPIが?


返信引用
ペコ
 ペコ
(@ペコ)
ゲスト
結合: 19年前
投稿: 23
Topic starter  

Kerry様
ありがとうございました。
@err,hrの件、試してみます。

No Name様
例えば、FindFirstFile関数とかGlobalUnlock、GlobalUnlock関数等の場合は、
GetLastError関数の戻り値が明記されていたりします。
通常はこういったヘルプの値を使用するワケではないのでしょうか?
それとも、FormatMessage関数を使用する前提で、コード番号がまったく気にしないので
しょうか?
普通の使い方が分からなくて、申し訳ありません。

超初心者様
すいません。確保しようとしているのは100KBです。間違えました。
300MBのうちの100KBを確保しようとして、エラーが帰って来ます。
本当に謎です。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 23年前
投稿: 1235
 

1. GetLastErrの戻り値を一度ここに公開するのもてだと思います。
  している人がいるかも知れません。
2. 「FormatMessage」を使って、取得内容を公開するのもてですね。
  メッセージを見ると何か過ちに気付くかもしれません。
3. 100KB程度なら「new/delete」使ってもししょうはないと思います。
  但し、「GlobalAlloc」を使わなければいけないのなら別です。


返信引用
ペコ
 ペコ
(@ペコ)
ゲスト
結合: 19年前
投稿: 23
Topic starter  

ITO様、ご回答ありがとうございました。

GetLastError関数の戻り値は0x06で、
前述の@err,hrで見ると、[ハンドルが無効です]でした。

GlobalAlloco以前にどこかでメモリを壊してるのでしょうか?
どういった場合にこのエラーが発生するのでしょう。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 23年前
投稿: 1235
 

http://www.kumei.ne.jp/c_lang/sdk/sdk_82.htm
参考にどうぞ、
「GlobalAlloc」ぐぐるといろいろ出てるよ。
いろいろな例を参考にして、自分のコードと何処が違うか比べてみるのも手です。


返信引用
え~いち
 え~いち
(@え~いち)
ゲスト
結合: 20年前
投稿: 78
 

GetLastErr()の戻り値なら
スタートメニューからERR LOOKってツールで調べられますよ
ERRLOOK.EXEってツールがVC++6.0インストールするとついてきます

100KBが取れないってのはなかなか起こりえないと思いますが・・・


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 23年前
投稿: 1235
 

ハンドルは、「HANDLE」じゃないです。
「HGLOBAL」です。
確認して下さい。
MSDN参照のこと。


返信引用
ペコ
 ペコ
(@ペコ)
ゲスト
結合: 19年前
投稿: 23
Topic starter  

皆さん、ご親切な回答、本当にありがとうございます。
エラーが発生するプログラムはかなりの実績があり、処理するデータや機械によって出た
り出なかったりします。
なかなか考えにくいエラーですが、なんとか頑張ります。


返信引用
ペコ
 ペコ
(@ペコ)
ゲスト
結合: 19年前
投稿: 23
Topic starter  

皆さん、いろいろとありがとうございました。
かなり地道な調査の結果、該当処理の前にメモリーエラーが発生していたようです。

本来、GetLastError関数の戻り値を知るにはどうすれば良いのかなっと思って投稿したの
ですが、皆様の熱いご説明に圧倒されました。
本当にありがとうございます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました