4

デバッグ上の理由から、C++ DLL (gcc および mingw32 でコンパイル) 用の jna ラッパーを作成しています。

write16Byte.dll

void write16Byte(const BYTE* mem) {
  FILE* out = fopen("BSTRvalues.txt", "a+");
  if (out == NULL) {
    printf("Error opening file!\n");
  return;
  }
  for (int i=0; i<16; i++) fprintf(out, "0x%x ", mem[i]);
  fwprintf(out, L"\n");
  fclose(out);
}

jna ラッパー

public interface W16BDll extends com.sun.jna.Library {
  W16BDll INSTANCE = (W16BDll)com.sun.jna.Native.loadLibrary("write16Byte.dll", W16BDll.class);
  void write16Byte(com.sun.jna.Memory version);
}

fprintf を削除するとすべて正常に動作するため、 fprintf の呼び出しは「java.lang.Error: Invalid memory access」になります (標準出力への書き込み時に JNA Invalid memory accessのスレッドを既に読み込んでいます) 。

4

1 に答える 1

0

コンパイラ ( -Wallgcc) で警告を有効にすると、書式文字列と実際の引数が一致していないことが通知されます。

"%x"intパラメータが必要です。あなたが提供していますconst BYTE。通常、これはガベージを生成するだけだと思いますが、CPU、アーキテクチャ、およびスタック レイアウトによっては、さまざまな障害が発生する可能性があります。

にキャストmem[i]するint(または と互換性のある形式を使用するconst BYTE) 必要があります。

于 2013-10-18T10:12:34.897 に答える