Ошибка импорта DLL при использовании WinDivert
Я собираюсь разработать программу с использованием WinDivert для управления сетевым трафиком. Я использую язык C++, и программа разработана под Visual Studio 2008. Во-первых, я создаю проект в Visual C++ CLR (приложение Windows Forms), чтобы я мог просто реализовать пользовательский интерфейс.
Для импорта библиотеки WinDirvert я сделал следующие настройки в свойствах проекта:
- Свойства конфигурации: общие
Поддержка общеязыковой среды выполнения: поддержка общеязыковой среды выполнения (/ctr) - Свойства конфигурации: Линкер
Дополнительные зависимости: ссылка на 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