質問

Visual C ++ 2008でWindowsフォームを使用して単純なGUIを作成しました。GUIにボタンがあります。ボタンが押されたら、マウスカーソルに座標(0,900)を指すようにします。指定された場所(x、y)にカーソル位置を設定する個別のヘッダーとC ++ソースファイルを作成しました。このために、Win32のsetCursorpos()関数を使用しました。 .NETを使用してGUIのみをビルドすることを望んでいるため、別のファイルにカーソル位置を設定するためのコードを書きました。その他の機能については、ネイティブC ++およびWin32ライブラリを使用します。

コードを構築している間、リンク時に次のエラーメッセージが表示されます。

1>SimpleForms.obj : error LNK2028: unresolved token (0A00000F) "extern "C" int __stdcall SetCursorPos(int,int)" (?SetCursorPos@@$$J18YGHHH@Z) referenced in function "private: void __clrcall SimpleForms::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@SimpleForms@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)

1>SimpleForms.obj : error LNK2019: unresolved external symbol "extern "C" int __stdcall SetCursorPos(int,int)" (?SetCursorPos@@$$J18YGHHH@Z) referenced in function "private: void __clrcall SimpleForms::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@SimpleForms@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)
役に立ちましたか?

解決

(?setCursorpos @@ $$ j18yghhh@z)

関数名がC ++名の装飾をどのように取得したかに注意してください。関数の宣言は間違っていますが、Extern "C"を使用することが必要です。単に含めることで、この種の間違いを避けてください <windows.h>.

しかし、このようにしないでください。 Windowsフォームを使用すると、カーソルも移動できます。

    System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
        System::Windows::Forms::Cursor::Position = Point(0, 900);
    }

私は名前の装飾に真剣に惑わされました。それは不快なリンカーエラーメッセージです。本当の問題は、プロジェクトが必要なWindowsインポートライブラリをリンクしていないことです。プロジェクト、プロパティ、リンカー、入力を右クリックします。追加の依存関係設定から$(noinherit)を削除します。 vs2010を使用する場合は、その設定に「user32.lib」を入れます。

この特定のケースでは、.NETカーソルクラスを引き続き使用する必要があります。

他のヒント

あなたはそれをすることはできません。

.NETからC ++を使用する場合は、P/Invokeが可能な.NETにCインターフェイスを公開するか、代わりにC ++/CLIを使用する必要があるため、管理されたコードが得られます。 (まあ、私はあなたもcom要素を公開することができると思いますが、それはワームのまったく他の缶です)

これは、あなたがただ困難を求めているように聞こえます - 完全に管理されたコード、または完全にネイティブコードのいずれかを使用したくない理由はありますか?それらを混ぜることは王室のピタです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top