2

私は以下を持っています、そして私はDllImportを取り巻くエラーをシフトすることができません

#include "stdafx.h"
#include <msclr/auto_gcroot.h>

using namespace System;
using namespace System::Diagnostics;
using namespace System::Runtime::InteropServices;
using namespace System::Threading;
using namespace System::Collections::Generic;
using namespace System::Text;

namespace WinFlix
{
    class FlickWin
    {
        [DllImport("user32.dll")]
        extern "C" bool SetForegroundWindow(IntPtr hWnd);

staticこのクラスは、C ++。NETでは使用できないクラスであったC#から変換してきました。私の新しいC++プロジェクトは、「CLRコンソールアプリケーション」タイプです。

私は得る

エラーC2059:構文エラー:'文字列'

エラーC2238:「;」の前に予期しないトークンがあります

どちらもその'extern"C"'行を参照しています。

以前の作業を検索しましたが、C ++ / CLIに精通している間は、これまでこのようなWinAPI関数を呼び出す必要はありませんでした。これらの2つのエラーは私を打ち負かしているすべてです:-/

TBH、これは私の忍耐力を使い果たし、私はそれを削除し、戻って再作成することができましたが、代わりにC#を修正することを好みました。ただし、今後の参考のために感謝します。

4

2 に答える 2

6

extern"C"はDllImportには不適切です。それがエラーの原因です。

問題は、クラス内でP/invokeを宣言していることです。私の知る限り、C ++では、これらはクラスの外部でフリー関数として宣言されることを意図しています。おそらくC++/CLIからのP/invokeが必要ないため、C ++/CLIからのP/invokeに関するドキュメントはあまり見つかりませんでした。

コンパイラは標準のC++ヘッダーファイルをインクルードし、ネイティブライブラリにリンクできるため、C ++/CLIでP/invokeを実行する必要はありません。windows.hをインクルードし、Win32APIを呼び出すだけです。これは、C ++/CLIの最も優れた点の1つです。

于 2011-09-19T09:50:01.103 に答える
1

これは正しいC++/CLI関数の定義です。

[DllImport( "user32.dll")]         
static int SetForegroundWindow(IntPtr hWnd);

DavidHeffernanに同意します。C++/CLIでPInvokeを使用する意味はありません。APIを直接呼び出すだけです。PInvokeは、C#/VB.NET開発者向けです。

于 2011-09-19T09:57:51.100 に答える