2012-04-13 15 views
0

私はそれを使用しているときにmemmove()とmemcpy()に問題があります。私は本当に私のコードで何が間違っているのか分かりません。私はQTを使用する方法で。質問:memmove()とmemcpy()on QT(C++)

HANDLE hFile; 
HANDLE hMapFile; 
HANDLE hMapView; 

hFile = CreateFileW((const wchar_t*) objPath.constData(), GENERIC_READ , 0, NULL, OPEN_EXISTING, 0, NULL); 
if (hFile != INVALID_HANDLE_VALUE){ 

    hMapFile = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL); 
    if (hMapFile != INVALID_HANDLE_VALUE){ 

     hMapView = MapViewOfFile(hMapFile, GENERIC_READ, 0, 0,0); 
     if (hMapView != INVALID_HANDLE_VALUE){ 
      uint DefineWord; 
      memmove((void *) &DefineWord, hMapView,2); // <- always error right here 
      qDebug()<<DefineWord; 
     } 
    } 
} 
+0

あなたが何についてより明確にした場合、それが参考になりますあなたは尋ねている。ソースコードに「いつものエラーがあります」というコメントがあります。エラーの内容を正確に教えてください(エラーメッセージはありますか?)。ソースコードだけでなく、質問にその情報を入力してください。ありがとう。 –

+0

特に、コードをコンパイルするときや実行するときにエラーが発生していますか? –

+0

私がデバッグしているときに、メッセージ "segmentation fault" SIGSEGVがあります。 – user1276647

答えて

1

hMapViewはポインタではありません。 memmoveには2つのポインタが必要です。 hMapViewを正しく宣言することでこれを修正してください。 LPVOIDである必要があります。

+0

また、宣言をLPVOID hMapViewに変更しました。常に同じエラーメッセージが表示されます。 "セグメンテーションフォールト" SIGSEGV。 – user1276647

0

QTを使用しています。

あなたの例では実際に使用していません。 QtにはQFile::mapメソッドがあり、プラットフォーム固有のMapViewOfFileの代わりに使用することができます。

+1

それは本当に質問への答えですか、それともコメントでなければなりませんか? –

+0

@KeithThompson:あなたが私の答えを嫌いなら、自分で書いてください。 1行のコードではなく3深いレベルの 'if'を使うことは逆効果です。 – SigTerm

+0

あなたは優れたアドバイスを提供しているかもしれません(私は 'MapViewOfFile'や' QFile :: Map'で十分理解していません)。私は、OPが求めている質問に対する直接的な答えであると確信していません。「これはなぜこのコードでエラーになるのですか?」というようなものです。問題を診断してより良い解決策を提案できれば、素晴らしい答えが得られます。 –

1

MapViewOfFileは、INVALID_HANDLE_VALUE(-1)ではなく、エラーがある場合はNULL(0)を返します。

編集:あなたのコードと他の多くの問題がありました:

  • QString::constData()戻りQChar*、ないwchar_t*は、あなたの代わりにQString::utf16()を使用する必要があります。
  • CreateFileMappingWに失敗した場合は、INVALID_HANDLE_VALUEではなくNULLが返されます。
  • MapViewOfFileアクセスパラメータはFILE_MAP_READで、GENERIC_READではありません。
  • uintは2バイトよりも大きいことが多いので、2バイトのみを読み取る場合は、memmoveより前に変数を0に初期化する必要があります。ここで

(のみwineg ++ /ワインでテスト)動作するはず最小限のコードです:

#include <windows.h> 
#include <QtCore/QString> 
#include <QtCore/QDebug> 
#include <QtCore/QTextStream> 

int main(int argc, char const *argv[]) 
{ 
    if (argc < 2) { 
     QTextStream(stdout) << "Usage :" << argv[0] << " filename" << endl; 
     return 1; 
    } 

    QString objPath(argv[1]); 
    // Qt source uses C-Style cast from utf16() to (wchar_t*), 
    // so it should be safe 
    HANDLE hFile = CreateFileW((const wchar_t *) objPath.utf16(), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); 
    if (hFile == INVALID_HANDLE_VALUE) { 
     qDebug() << qt_error_string(); 
    } else { 
     HANDLE hMapFile = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL); 
     if (!hMapFile) { 
      qDebug() << qt_error_string(); 
     } else { 
      void *pMapView = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0); 
      if (!pMapView) { 
       qDebug() << qt_error_string(); 
      } else { 
       uint DefineWord = 0; 
       memmove((void *) &DefineWord, pMapView, 2); 
       qDebug() << DefineWord; 
      } 
      CloseHandle(hMapFile); 
     } 
     CloseHandle(hFile); 
    } 
    return 0; 
} 

PS:QString qt_error_string(int errorCode = -1)は(から直近のエラー文字列を返す明らかに文書化されていないQtの機能でありますGetLastError()またはerrnoから返されたエラーコード)。

Qtを使用している場合は、ファイルをQFile::map()でメモリにマップできます。あなたの最初のコードが行うことになっていた何をすべきか
、あなただけが見つかったのサンプルコード(プラスエラーチェック)に2行を追加する必要がありました:

QFile file("foo"); 
if(!file.open(QFile::ReadOnly)) { 
    qDebug() << file.errorString(); 
} else { 
    uchar *memory = file.map(0, file.size()); 
    if (!memory) { 
     qDebug() << file.errorString(); 
    } else {    
     uint DefineWord = 0; 
     memmove(&DefineWord, memory, 2); 

     file.unmap(); 
    } 
} 
+0

QFile :: map()でファイルをマップする方法がわかりません。 しかし、私はいくつかのコード例を持っています。 QFileファイル( "foo"); file.open(QFile :: ReadOnly); uchar * memory = file.map(0、file.size()); if(memory){ //データで楽しいことがあります file.unmap(); } – user1276647

+0

@ user1276647私は自分の答えを – alexisdm

+0

編集しました!驚くばかり!ありがとう、相棒... – user1276647