Ошибка импорта DLL при использовании WinDivert

Я собираюсь разработать программу с использованием WinDivert для управления сетевым трафиком. Я использую язык C++, и программа разработана под Visual Studio 2008. Во-первых, я создаю проект в Visual C++ CLR (приложение Windows Forms), чтобы я мог просто реализовать пользовательский интерфейс.

Для импорта библиотеки WinDirvert я сделал следующие настройки в свойствах проекта:

  1. Свойства конфигурации: общие
    Поддержка общеязыковой среды выполнения: поддержка общеязыковой среды выполнения (/ctr)
  2. Свойства конфигурации: Линкер
    Дополнительные зависимости: ссылка на WinDivert.lib
    Файл определения модуля: ссылка на windivert.def

В проект, который я создал, я также добавил windivert.h в заголовочные файлы.

Кроме того, windivert.h включен в основную точку входа моего проекта (ProjectG.cpp):

#include "stdafx.h"
#include "Form1.h"
#pragma managed(push, off)
#include "windivert.h"
#pragma managed(pop)

using namespace ProjectG;

[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
    // Enabling Windows XP visual effects before any controls are created
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false);

    // Create the main window and run it
    Application::Run(gcnew Form1());


    HANDLE handle;
    unsigned char packet[8192];
    UINT packet_len;
    WINDIVERT_ADDRESS addr;
    handle = WinDivertOpen("udp", WINDIVERT_LAYER_NETWORK, 0,
        WINDIVERT_FLAG_DROP);
    if (handle == INVALID_HANDLE_VALUE)
    {
        Application::Exit();        
    }
    while (TRUE)
    {
        // Read a matching packet.
        if (!WinDivertRecv(handle, packet, sizeof(packet), &addr, &packet_len))
        {
            MessageBox::Show("Fail");
            continue;
        }
    }
    return 0;
}

Наконец, я поместил {WinDivert.dll, windivert.h, WinDivert.lib, WinDivert32.sys} в каталог проекта.

Однако отображается следующая ошибка:

fatal error LNK1306: DLL entry point "int __clrcall main(cli::array<class
System::String ^ >^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z) cannot be managed;    
compile to native   ProjectG.obj    ProjectG

Дополнительно: (предупреждение)

warning LNK4070: /OUT:WinDivert.dll directive in .EXP differs from output filename   
'C:\Users\David\Desktop\css\ProjectG\Debug\ProjectG.exe'; ignoring directive    
ProjectG.exp    ProjectG

Вопрос: Как я могу разрешить эту ситуацию?

1 ответ

Решение

А) ваш основной источник.cpp, так что вы можете удалить [STAThreadAttribute] и изменить
int main(array<System::String ^> ^args) в int _tmain(int argc, _TCHAR* argv[])

b) исключить windivert.def из файла определения модуля компоновщика, это только при создании DLL

c) файлы DLL/SYS должны быть скопированы в папки Debug и Release

Другие вопросы по тегам