我将使用WinDivert设计一个程序来操纵网络流量。 我使用的语言是C ++,程序是在Visual Studio 2008下设计的。 首先,我在visual C ++ CLR(Windows Forms Application)中创建了一个项目,因此我可以简单地实现UI。
为了导入WinDirvert库,我在项目属性中完成了以下设置:
在我创建的项目中,我还在头文件中添加了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
问题: 我该如何解决这种情况?
答案 0 :(得分:0)
a)您的主要来源是.cpp,因此您可以删除[STAThreadAttribute]
并更改
int main(array<System::String ^> ^args)
至int _tmain(int argc, _TCHAR* argv[])
b)从链接器模块定义文件中排除windivert.def,这仅在您创建DLL时
c)需要将DLL / SYS文件复制到Debug和Release文件夹