使用WinDivert时DLL导入失败

时间:2014-06-18 10:24:10

标签: c++-cli dllimport unmanaged wfp

我将使用WinDivert设计一个程序来操纵网络流量。 我使用的语言是C ++,程序是在Visual Studio 2008下设计的。 首先,我在visual C ++ CLR(Windows Forms Application)中创建了一个项目,因此我可以简单地实现UI。

为了导入WinDirvert库,我在项目属性中完成了以下设置:

  1. 配置属性:一般
    公共语言运行时支持:公共语言运行时支持(/ ctr)
  2. 配置属性:链接器
    附加依赖项:WinDivert.lib的链接
    模块定义文件:windivert.def的链接
  3. 在我创建的项目中,我还在头文件中添加了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 个答案:

答案 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文件夹