0

x64 アーキテクチャ用のピン配置に付属する The Mypintool サンプルをビルドしようとしています。pin3.0 (ビルド 76991) と Visual Studio 2012 を使用しています。含まれていなければ、ビルドは成功していwindows.hます。しかし、次のようにwindow.h(別の名前空間に)含めると:-

namespace WD {
    #include "Windows.h"
}

次に、ビルドでエラーが発生します:-

C:\Program Files (x86)\Windows Kits\8.0\Include\um\winnt.h(3486): error C2888: '_CONTEXT::<unnamed-tag>' : symbol cannot be defined within namespace 'WD'
C:\Program Files (x86)\Windows Kits\8.0\Include\um\winnt.h(3488): error C2888: '_CONTEXT::<unnamed-tag>::<unnamed-tag>' : symbol cannot be defined within namespace 'WD'

windows.hまた、問題なく含まれているwin32用のツールをビルドできます。また、win32 と x64 のビルド設定を比較しましたが、相違点は見つかりませんでした。

どんな助けでも大歓迎です。

4

1 に答える 1

1

「Pin」を使用する Windows アプリケーションがあるか、いくつかの Windows API を呼び出す必要がある「Pin」アプリケーションがあるか、または単一のプログラムで両方の API を大量に使用するハイブリッドがあるかは、私にはわかりません。

それにもかかわらず、Windows SDK は非常に大きく、(ほとんどの場合) C、または C と互換性のある C++ のサブセットで動作するように設計されているため、名前空間にラップされている場合は動作することが期待できません。

したがって、ヘッダーの競合に対処する唯一の効果的な方法は、同じ cpp ファイルに "pin" または "windows" ヘッダーを含めないようにすることです。ウィンドウを呼び出すプログラムの部分と、「ピン」を呼び出すプログラムの部分を別々の cpp ファイルに分割する必要があります。

C++ 宣言のみを使用するクラスと関数を定義するブリッジ ヘッダー ファイルを作成します。ピンもウィンドウも使用しないため、このファイルはプロジェクトの両側で #include できます。もちろん、アプリケーションが何を達成しようとしているのかによっては、これが難しい場合があるため、強力なタイプの消去を行う必要がある場合があります。

このようなもの:

// pin.cpp
#include <intel/pin.h>
#include "bridge.h"

void method(){
  Window* wnd = Window::Create();
  wnd.Show();
}

.

// bridge.h
class Window {
public:
  static Window* Create();
  virtual void Show()=0;
};

.

// WindowsImpl.cpp
#include <windows.h>
#include "bridge.h"

class WindowImpl : public Window {
  HWND hwnd;
public:
  bool Create(){
    hwnd = CreateWindowEx(...);
    return hwnd != NULL;
  }
  void Show() override {
    ShowWindow(hwnd,...);
  }
};
Window* Window::Create(){
  WindowImpl* newWnd = new WindowImpl();
  newWnd->Create();
  return newWnd;
}
于 2016-08-01T13:40:30.413 に答える