1

アプリケーションが共有メモリを介して提供するステータス情報を読みたい。その名前付き共有メモリのコンテンツを読み取り、C#クラスからpinvokeで呼び出すために、C++を使用したいと思います。

ソフトウェアから、私はそれが特定のファイル構造を持っていることを知っています:STATUS_DATAの4つの構造体の配列を持つ構造体SYSTEM_CHARACTERISTICS

私は(まだ)C ++に精通していないので、基本的にmsdnをフォローしようとしました。マップするファイルのサイズを見つけるために、以下のコードに示されているように、構造体メンバーのサイズを追加しました。これにより、アクセスが拒否されたため、構造体に基づく結果が高すぎると考えました。使用するとsizeof(STATUS_DATA)(ソースに構造体を追加しました)、それでもACCESSDENIEDになります。1024バイトなど、もっと低いものを試してみると、デバッグ中に表示されるpbufのは、だけです。<

これは私がこれまでに得たものです:

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <iostream>
#pragma comment(lib, "user32.lib")

using namespace std;


signed int BUF_SIZE = 4 * (10368 + 16 + 4 + 16 + 4 + 16 + 4 + 1 + 4); // sizeof(STATUS_DATA);
TCHAR szName[]=TEXT("ENGINE_STATUS");

int main()
{
   HANDLE hMapFile;
   unsigned char* pBuf;

   hMapFile = OpenFileMapping(
                   FILE_MAP_READ,    // read access
                   FALSE,                 // do not inherit the name
                   szName);               // name of mapping object 

   if (hMapFile == NULL) 
   { 
      _tprintf(TEXT("Could not open file mapping object (%d).\n"), 
             GetLastError());

      return 1;
   } 

   pBuf = (unsigned char*) MapViewOfFile(hMapFile, // handle to map object
               FILE_MAP_READ,  // read/write permission
               0,                    
               0,                    
               BUF_SIZE); // 1024);                  

   if (pBuf == NULL) 
   { 
      _tprintf(TEXT("Could not map view of file (%d).\n"), 
             GetLastError()); 

   CloseHandle(hMapFile);
      return 1;
   }

   UnmapViewOfFile(pBuf);

   CloseHandle(hMapFile);

   return 0;
}

また、そのヒントに従うことで、この共有メモリが「存在する」ことを確認しました。誰かが私にヒントを教えてもらえますか、私が欠けているものは何ですか?ありがとう!

4

1 に答える 1

3

MapViewOfFileの最後のパラメーター(dwNumberOfBytesToMap)は、マッピングの作成時に指定された最大サイズよりも小さくする必要があります。そのサイズがわからないので、BUF_SIZEがそれを超えており、1024は超えていないと想定するのが妥当と思われます。このパラメーターに0を指定すると、ファイル全体を1つのビューにマップする簡単な方法です。

ほとんどの(すべて?)C ++デバッガーは、charへのポインターがnullで終了する文字列であると想定するため、マップされたデータを表示しようとすると、最初のバイトがゼロになるまでしか表示されません。ファイルマッピングに含まれるデータによっては、これが2番目のバイトになる可能性があります。これは、多くの情報が表示されない理由を説明しています。返されたポインタをSTATUS_DATA*にキャストし、個々のメンバーを表示することをお勧めします。

要するに:

  • dwNumberOfBytesToMapにゼロ(0)を指定します
  • 返されたポインタをunsignedchar*ではなくSTATUS_DATA*にキャストします
于 2009-10-12T11:02:01.483 に答える