在Visual Studio 2015中使用Npcap编译VC ++程序

时间:2016-08-04 06:08:10

标签: c++ visual-studio dll pcap

我正在Visual Studio 2015社区版中编译以下程序。

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <pcap.h>

int main(int argc, char **argv)
{

    pcap_if_t *alldevsp, *device;


    char errbuf[100];
    int count = 1;

    //First get the list of available devices
    printf("Finding available devices ... ");
    if (pcap_findalldevs(&alldevsp, errbuf))
    {
        printf("Error finding devices : %s", errbuf);
        exit(1);
    }
    printf("Done");

    //Print the available devices
    printf("\nAvailable Devices are :\n");
    for (device = alldevsp; device != NULL; device = device->next)
    {
        printf("%d. %s - %s\n", count, device->name, device->description);
        count++;
    }

    return 0;
}

对于pcap我从Npcap project @ GitHub下载了库。 我安装了获取DLL的版本,并将其SDK库用于头文件和链接库。 DLL的安装来自发行包0.0.8-r2,SDK来自0.0.7-r9。

通过网络上的几个指示如何设置环境,我有以下设置。

  1. 配置属性 - &gt; C / C ++ - &gt;一般 - &gt;其他包含目录 - &gt;来自SDK的头文件夹的路径。
  2. 配置属性 - &gt; C / C ++ - &gt;预处理器 - &gt;预处理器定义 - &gt; WIN32 _DEBUG _CONSOLE WPCAP HAVE_REMOTE
  3. 配置属性 - &gt;链接器 - &gt;一般 - &gt;附加图书馆目录 - &gt;从SDK获取库文件夹的路径。
  4. 配置属性 - &gt;链接器 - &gt;输入 - &gt;附加依赖性 - &gt; wpcap.lib Packet.lib
  5. 来自release exe的

    DLL安装在C:\ Windows \ System32 \ Npcap中。 系统是Windows 10 Home。

    问题:

    上述程序编写得很好。

    1>------ Build started: Project: HelloWorld, Configuration: Debug Win32 ------
    1>  HelloWorld.cpp
    1>  HelloWorld.vcxproj -> C:\Users\xxx\documents\visual studio 2015\Projects\HelloWorld\Debug\HelloWorld.exe
    1>  HelloWorld.vcxproj -> C:\Users\xxx\documents\visual studio 2015\Projects\HelloWorld\Debug\HelloWorld.pdb (Full PDB)
    ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
    

    当我运行它时,它抱怨缺少wpcap.dll文件。我是VS以及VC ++的新手,我用google搜索和最简单的技术,我发现只是克服了这个问题,我将DLL从System32复制到生成.exe文件的文件夹。

    这个DLL问题消失后,但现在我得到了。

    'HelloWorld.exe' (Win32): Loaded 'C:\Users\xxx\Documents\Visual Studio 2015\Projects\HelloWorld\Debug\HelloWorld.exe'. Symbols loaded.
    'HelloWorld.exe' (Win32): Loaded 'C:\Windows\syswow64\ntdll.dll'. Cannot find or open the PDB file.
    'HelloWorld.exe' (Win32): Loaded 'C:\Windows\syswow64\kernel32.dll'. Cannot find or open the PDB file.
    'HelloWorld.exe' (Win32): Loaded 'C:\Windows\syswow64\KernelBase.dll'. Cannot find or open the PDB file.
    'HelloWorld.exe' (Win32): Loaded 'C:\Windows\syswow64\ucrtbased.dll'. Cannot find or open the PDB file.
    'HelloWorld.exe' (Win32): Loaded 'C:\Windows\syswow64\vcruntime140d.dll'. Cannot find or open the PDB file.
    The thread 0x160c has exited with code -1073741701 (0xc000007b).
    The thread 0xd5c has exited with code -1073741701 (0xc000007b).
    The thread 0x16c4 has exited with code -1073741701 (0xc000007b).
    The program '[9632] HelloWorld.exe' has exited with code -1073741701 (0xc000007b).
    
    我用谷歌搜索了它,似乎有64位和32位DLL的混合。我不知道如何开始调试这个问题。

    如果有人指导我解决,我真的很感激。

    1. 更好的方法(在VC ++世界中的好习惯)找到DLL而不是复制到exe文件夹。
    2. 有关如何查找导致问题的DLL的提示。
    3. 感谢您的时间。

1 个答案:

答案 0 :(得分:0)

从配置中,HelloWorld.exe是一个32位(x86)程序。我假设您使用的是x64 Windows操作系统,因此C:\Windows\System32\Npcap适用于x64 DLL。 C:\Windows\SysWOW64\Npcap适用于x86 DLL。

您收到0xc000007b错误,因为您的x86 HelloWorld.exe正在尝试加载Npcap的x64 DLL,这绝对不对。

因此,解决方案是将DLL(wpcap.dllPacket.dll)从C:\Windows\SysWOW64\Npcap复制到生成.exe文件的文件夹中。

另一种方法是将C:\Windows\System32添加到PATH环境变量中。所以你的x86和x64二进制文件总是会找到正确的Npcap DLL,无论它们位于何处。