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);

我一直在从 C# 翻译这个类,它是一个static类,在 C++.NET 中不可用。我的新 C++ 项目属于“CLR 控制台应用程序”类型。

我明白了

错误 C2059:语法错误:“字符串”

错误 C2238:';' 前面的意外标记

两者都指的是'extern“C”'行。

我搜索了我以前的工作,虽然我能胜任 C++/CLI,但我以前不必像这样调用 WinAPI 函数。这两个错误都在打败我:-/

TBH,这件事耗尽了我的耐心,我删除了它,可以回去重新创建它,但我更喜欢修复我的 C#。不过,感谢您的帮助以供将来参考。

4

2 回答 2

6

外部“C”不适用于 DllImport。这就是错误的根源。

问题是你在一个类中声明你的 P/invoke。据我所知,在 C++ 中,它们被声明为任何类之外的自由函数。我没有从 C++/CLI 中找到很多关于 P/invoke 的文档,可能是因为 C++/CLI 不需要 P/invoke。

您不需要使用 C++/CLI 进行 P/invoke,因为编译器可以包含标准 C++ 头文件并链接到本机库。只需包含 windows.h 并毫不费力地调用 Win32 API。这是 C++/CLI 的优点之一。

于 2011-09-19T09:50:01.103 回答
1

这是正确的 C++/CLI 函数定义:

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

同意 David Heffernan,在 C++/CLI 中使用 PInvoke 没有意义——直接调用 API 即可。PInvoke 适用于 C#/VB .NET 开发人员。

于 2011-09-19T09:57:51.100 回答