Перевести DllImport из статического члена статического класса в консольном приложении C # в член консольного приложения C ++ CLR - PullRequest
2 голосов
/ 19 сентября 2011

У меня есть следующее, и я не могу переместить ошибку, связанную с 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 Console Application".

Я получаю

ошибка C2059: синтаксическая ошибка: 'string'

и

ошибка C2238: неожиданные маркеры перед ';'

оба ссылаются на эту 'внешнюю строку' C ''.

Имеюискал мою предыдущую работу, и хотя я компетентен в C ++ / CLI, мне не приходилось вызывать функции WinAPI, как это раньше.Эти две ошибки - все, что меня бьет: - /

TBH, эта вещь исчерпала мое терпение, и я удалил ее, мог вернуться и воссоздать ее, но вместо этого я предпочел исправить свой C #.Хотя помощь нужна для дальнейшего использования.

Ответы [ 2 ]

6 голосов
/ 19 сентября 2011

Экстерьер "C" не подходит для DllImport. Это источник ошибки.

Проблема в том, что вы объявляете свой P / invoke внутри класса. Насколько я могу судить, в C ++ они должны быть объявлены как свободные функции вне каких-либо классов. Я не нашел много документации для P / invoke из C ++ / CLI, вероятно, потому что P / invoke не требуется из C ++ / CLI.

Вам не нужен P / invoke с C ++ / CLI, потому что компилятор может включать стандартные заголовочные файлы C ++ и ссылаться на собственные библиотеки. Просто включите windows.h и вызовите Win32 API без каких-либо дополнительных усилий. Это один из лучших моментов C ++ / CLI.

1 голос
/ 19 сентября 2011

Это правильное определение функции C ++ / CLI:

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

Согласитесь с Дэвидом Хеффернаном, нет смысла использовать PInvoke в C ++ / CLI - просто вызовите API напрямую.PInvoke для разработчиков на C # / VB .NET.

...