• ベストアンサー

ReadEventLogについて

教えてください。 ReadEventLogでイベントログ情報を取得したいのですが、わからない所があります。 ReadEventLogのpBufはEVENTLOGRECORD型なのです。ですが、メモリを確保するためGlobalAllocを使いたいのですが、HGLOBAL(Void)型なのでキャストしてもうまくいきません。 型を変える方法があるのでしょうか? あるのであれば教えてください。 [ソース一部] EVENTLOGRECORD *pBuf = NULL; HGLOBAL hDIB; hDIB = GlobalAlloc(GMEM_FIXED, BufSize); pBuf = (EVENTLOGRECORD)hDIB; //★ここでエラー bResult = ::ReadEventLog(hEventLog,EVENTLOG_FORWARDS_READ | EVENTLOG_SEQUENTIAL_READ,0,pBuf,BufSize,&ReadBytes,&NextSize);

質問者が選んだベストアンサー

  • ベストアンサー
  • nitscape
  • ベストアンサー率30% (275/909)
回答No.1

キャストでしたら pBuf = (EVENTLOGRECORD)hDIB; ではなく pBuf = (EVENTLOGRECORD*)hDIB; なるかと思います。

その他の回答 (1)

  • hope10
  • ベストアンサー率48% (17/35)
回答No.2

そのメモリ関数は16bit時代の遺産です。 今は素直に32bit用のHeap関数かスタックを使うべきでしょう。 もちろん正しい使い方をすればエラーは出なくなりますが、お勧めしないので気になるならヘルプを見て下さい。

関連するQ&A

  • イベントログの読み込み 

    すみません。 教えてくださいませ。 早速ですが、Vc++でイベントログを取得するプログラムを作成しているのですが、うまくいきません。 [ソース] DWORD BufSize; DWORD ReadBytes; DWORD NextSize; DWORD EventNum; BOOL bResult; HANDLE hEventLog = NULL; HGLOBAL hDIB; try{ /* イベントログのオープン */ hEventLog = ::OpenEventLog(NULL, "Application"); if(hEventLog == NULL){ eMsg = "ファイルオープンエラー"; return -1; } /* イベントログの最大数 */ bResult = GetNumberOfEventLogRecords(hEventLog, &EventNum); for(;;){ //最大サイズを取得 BufSize = 1; hDIB = GlobalAlloc(GMEM_FIXED, BufSize); bResult = ::ReadEventLog(hEventLog,EVENTLOG_FORWARDS_READ | EVENTLOG_SEQUENTIAL_READ,0,hDIB,BufSize,&ReadBytes,&NextSize); if(!bResult && GetLastError() != ERROR_INSUFFICIENT_BUFFER) { eMsg = "ファイルリードエラー"; CloseEventLog(hEventLog); GlobalFree(hDIB); return -1; } GlobalFree(hDIB); hDIB = NULL; BufSize = NextSize; hDIB = ::GlobalAlloc(GMEM_FIXED, BufSize); bResult = ::ReadEventLog(hEventLog,EVENTLOG_FORWARDS_READ | EVENTLOG_SEQUENTIAL_READ,0,hDIB,BufSize,&ReadBytes,&NextSize); if(!bResult){ eMsg = "ファイルリードエラー"; CloseEventLog(hEventLog); GlobalFree(hDIB); return -1; } } }catch(CException* e){ if(hEventLog != NULL){ eMsg = (LPCTSTR)e; CloseEventLog(hEventLog); } } GlobalFree(hDIB); return 1; [内容] 正常にコンパイルはするのですが、実行後エラーが出力されます。"ファイルリードエラー"(エラー文) メモリの確保がうまくいっていないのでしょうか?

  • ヒープメモリの解放について

    すみません教えてください。 VCを始めたばかりで、メモリ等の事が良くわかりません。 (2)で、Invalid Address specified to RtlValidateHeap( 340000, 344978 )やHEAP: Free Heap block 344970 modified at 344998 after it was freed のメモリエラーが出力されます。 調べてみると(1)で解放されていないのですが、delete pBufが処理されていないと思います。 記述等に問題があるのでしょうか? 調べてみると問題ないように思えるのですが・・・ ご存知の方教えてください。 <ソース> HANDLE hEventLog = NULL; EVENTLOGRECORD *pBuf = NULL; /* イベントログのオープン処理 */ : : : /* イベントログの最大数 */ bResult = GetNumberOfEventLogRecords(hEventLog, &EventNum); //最大サイズを取得 BufSize = 1; pBuf = new EVENTLOGRECORD; bResult = ::ReadEventLog(hEventLog,EVENTLOG_FORWARDS_READ | EVENTLOG_SEQUENTIAL_READ,0,pBuf,BufSize,&ReadBytes,&NextSize); if(!bResult && GetLastError() != ERROR_INSUFFICIENT_BUFFER) {  eMsg = "ファイルリードエラー2" ;  CloseEventLog(hEventLog);  delete pBuf;  return -1; } delete pBuf; --->(1)メモリが解放されない。 BufSize = NextSize; bResult = ::ReadEventLog(hEventLog,EVENTLOG_FORWARDS_READ | EVENTLOG_SEQUENTIAL_READ,0,pBuf,BufSize,&ReadBytes,&NextSize); if(!bResult && GetLastError() != ERROR_INSUFFICIENT_BUFFER){  eMsg = "ファイルリードエラー3";  CloseEventLog(hEventLog);  delete pBuf;  return -1;  } } delete pBuf; --->(2)ここでエラー

  • GlobalAlloc関数について

    char *Buf; Buf = GlobalAlloc(GMEM_FIXED, 1000); このように指定するとエラーが出てしまうのですが、 BufにはHGLOBALではなくcharを使いたいのですが、無理なのでしょうか? 環境はBorlandです。 よろしくお願いします

  • c++ メモリの確保を動的に変更する

    VC++2008 Express版で以下のプログラム(第1引数をクリップボードにセット)を作成しましたがメモリの確保量を自動的に調節するようにしたいのですが、どうしたらよろしいですか #include <stdio.h> #include <windows.h> void main(int argc,char *argv[]) { OpenClipboard(NULL); int iStrLen = 8;//★ここを調整したい★ HGLOBAL hMem = ::GlobalAlloc(GMEM_FIXED, iStrLen); LPTSTR pMem = (LPTSTR)hMem; ::lstrcpy(pMem, (LPCTSTR)argv[1]); ::EmptyClipboard(); ::SetClipboardData(CF_TEXT, hMem); ::CloseClipboard(); }

  • メモリ違反でソフトが強制終了してしまいます。

    コンパイルして実行すると ttp://kei100.jp/diary/images/20050612_0.png このようなメッセージが表示されてしまいます。 #include <windows.h> #include <stdio.h> #include <string.h> void main(void) { HANDLE hFile; HGLOBAL hg = GlobalAlloc(GMEM_FIXED, 1000); char* test = "test"; LPTSTR aaa="spacetestspace"; char* bbb = NULL; char ccc[5]; aaa=(char*)GlobalLock(hg); bbb = strstr(aaa, test); strncpy(ccc, bbb, strlen(test)); printf("ccc = %s \n", ccc); GlobalUnlock(hg); GlobalFree(hg); GlobalFree(aaa); } どなたか解決方法を知っている方、回答よろしくお願いします。

  • クリップボードへのコピー

    あるHPのコードを参考に文字をクリップボードへ コピーするコードを書いてみましたが、エラーが できます。なにかおかしいかご指摘いただけないでしょうか? HGLOBAL hText; wchar_t *pText; hText = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, 4); pText = (wchar_t*)GlobalLock(hText); lstrcpy(pText, L"abc"); GlobalUnlock(hText); OpenClipboard(NULL); EmptyClipboard(); SetClipboardData(CF_TEXT, hText);//ここでヒープが壊れていると起こられます。 CloseClipboard(); もっとも単純なテストコードです。 いろいろとチェックを手抜きしてますが、とりあえずOKとします。

  • C キャスト方法を教えてください

    C言語の初心者なのですが、 int abc(int(*read)(void*, int, int), int size, char* data); ような関数で第1引数の値をキャストするときどうすればよいですか。   int read = (????)NULL; そもそもint(*read)(void*, int, int)ってどういう意味ですか?

  • OLEサーバコンポーネントを作ってますが、、、

    CやVB6の経験は長いが、C++については、初心者です。 WordにOLE埋め込みするOLEサーバコンポーネントをC++で作ってます。 (Wordがコンテナです) RECT上にBitbltで、Gif画像を描いていて、それは、ちゃんと表示されているのですが、 いざ、Wordに埋め込むために、更新メニュークリック時のMsgループ内で if (m_bEmbedding && m_pDataAdviseHolder != NULL){      m_pDataAdviseHolder->SendOnDataChange(static_cast<IDataObject *>(this), 0, DVASPECT_CONTENT); } m_bDirty = TRUE; とやってるのですが、RECTの枠しかWord上に表示されません。 どのメソッドを調べればいいのか、お教え下さい。 一応、GetData にブレークポイントを入れているのですが、引っかかりません。 ただ、RECTの枠だけは、Word上に出てはいます。 尚、プログラムの大枠は、EternalWindowsさんの http://eternalwindows.jp/ole/oleembedded/oleembedded10.html を使わさせて頂いております。 それから、RECT上にBitbltで、Gif画像を描くのは、以下のようにしています。 void CObject::DrawShape(HDC hdc) { int i; RECT rc; long PictureWidth; long PictureHeight; i = 0; rc = m_shape[i].rc; Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom); if (m_vbHDC != NULL){      PictureWidth = rc.right - rc.left;      PictureHeight = rc.bottom - rc.top;      BitBlt(hdc, 0,0, PictureWidth, PictureHeight, m_vbHDC, 0,0, SRCCOPY); } それと、メタファイルの作成は、、、 x=0; y=0; GetSize(&nWidth, &nHeight); SetRect(&rc, x, y, x + nWidth, y + nHeight); hdc = CreateEnhMetaFile(m_vbHDC, NULL, &rc, "AAA"); SetMapMode(hdc, MM_ANISOTROPIC); SetWindowOrgEx(hdc, 0, 0, NULL); SetWindowExtEx(hdc, nWidth, nHeight, NULL); DrawShape(hdc); hmf = CloseEnhMetaFile(hdc); sizel.cx = nWidth; sizel.cy = nHeight; DPtoHIMETRIC(&sizel); hglobal = GlobalAlloc(GPTR, sizeof(METAFILEPICT)); lpmf = (LPMETAFILEPICT)GlobalLock(hglobal); lpmf->hMF = (HMETAFILE)hmf; lpmf->mm = MM_ANISOTROPIC; lpmf->xExt = sizel.cx; lpmf->yExt = sizel.cy; GlobalUnlock(hglobal); //if (bEnhance) { DWORD dwSize; LPBYTE lpData; HGLOBAL hglobalOld = hglobal; dwSize = GetMetaFileBitsEx(lpmf->hMF, 0, NULL); lpData = (LPBYTE)GlobalAlloc(GPTR, dwSize); GetMetaFileBitsEx(lpmf->hMF, dwSize, lpData); hglobal = (HGLOBAL)SetWinMetaFileBits(dwSize, lpData, NULL, lpmf); GlobalFree(lpData); GlobalFree(hglobalOld); //} return hglobal; です。 忌憚のないご指摘をお願いします。

  • VC++ Ver1.51での GetDIBits使用時のエラーについて

    GetDIBitsを初めて使用したのですが、コンパイル時にエラーが出るのですがどこが悪いのか気付けません。もし気になる所を見つけられた方は教えて頂けると幸いです。 // 画面のDC取得 LhGamenDC = GetDC(NULL); // メモリデバイスコンテキスト取得 MhBitmapMemDC = CreateCompatibleDC(LhGamenDC); MhBitmapDC = CreateCompatibleBitmap(LhGamenDC,(int)(LlnWidth),(int)(LlnHeight));      LlnSelObj = (HBITMAPSelectObjectMhBitmapMemDC,MhBitmapDC); GetObject(MhBitmapDC,sizeof(LtpBitmapAll),(LPSTR)&LtpBitmapAll); // イメージ全体のサイズ取得 bitsize = LtpBitmapAll.bmWidthBytes;      if(rest = (int)bitsize % 4) (int)bitsize += 4 - rest; bitsize *= LtpBitmapAll.bmHeight; //LtpBmpIHに情報セット LiColors = (1 << LtpBmpIH.biBitCount); if( LiColors > 256 ) LiColors = 0; LdwLen = LtpBmpIH.biSize + LiColors * sizeof(RGBQUAD); LhDIB = GlobalAlloc(GMEM_FIXED,LdwLen); LtplpBI = (LPBITMAPINFOHEADER)LhDIB; LbyteBits = (LPBYTE)GlobalAlloc(GMEM_FIXED,bitsize); Liret = GetDIBits(LhGamenDC, (HBITMAP)LtpBitmapAll, 0, (DWORD)LtpBmpIH.biHeight,(LPBYTE)LtplpBI + LdwLen, (LPBITMAPINFO)LtplpBI,DIB_RGB_COLORS); 以下のエラーが出ます。 'cast' : 指定されたオブジェクトは、'struct tagBITMAP ' 型から 'unsigned int '型に変換できません。・ 2つの整数値型の間で情報が失われました。・ 'argument' : 指定された演算子を含む式で、間接参照が矛盾しています。・'GetDIBits' : 実引数の型 4 は引数型リストや関数定義内で与えられた型と不一致です。・'GetDIBits' 実引数が少なすぎます。

  • jpgファイルのダウンロード

    WWWサーバー上にあるjpgファイルを指定してそれをダウンロードするプログラムをつくっています。 jpgファイルが作成されることはされるのですが、中身をみることができない状態になってしまいます。 どこが悪いのかわかる方がおられましたらご教授お願いします。 <ソースコード> #include <windows.h> #include <stdio.h> #include <wininet.h> int main(void) { HINTERNET hInet, hUrl; char szBuf[128], szUrl[128], *lpszSrc; DWORD dwRead, dwTotal = 0; HGLOBAL hMem; FILE *file; printf("URL---- "); gets(szUrl); hInet = InternetOpen(TEXT("neko"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); if(hInet == NULL){ perror("オープンエラー\n"); return -2; } hUrl = InternetOpenUrl(hInet, szUrl, NULL, 0, 0, 0); if(hUrl == NULL){ perror("URLオープンエラー\n"); return -3; } hMem = GlobalAlloc(GHND, 1); lpszSrc = (char*)GlobalLock(hMem); while(1){ InternetReadFile(hUrl, szBuf, (DWORD)sizeof(szBuf)-1, &dwRead); szBuf[dwRead] = '\0'; if(dwRead == 0){ break; } dwTotal += dwRead; hMem = GlobalReAlloc(hMem, dwTotal+1, GMEM_MOVEABLE); lpszSrc = (char*)GlobalLock(hMem); strcat(lpszSrc, szBuf); } if((file = fopen("test.jpg", "wb")) == NULL){ printf("ファイルオープンエラー\n"); goto end; } while(dwTotal){ fputc(*lpszSrc, file); lpszSrc++; dwTotal--; } fclose(file); end: GlobalUnlock(hMem); GlobalFree(hMem); InternetCloseHandle(hUrl); InternetCloseHandle(hInet); return 0; } <環境> Windows Vista VC++ 2005 EE