Компиляция программы VC++ с помощью Npcap в Visual Studio 2015

Я компилирую следующую программу в Visual Studio 2015 Community Edition.

#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 на GitHub. Я установил выпуск для получения DLL и использования его библиотеки SDK для библиотек заголовков и компоновщика. Установка DLL из пакета выпуска 0.0.8-r2 и SDK из 0.0.7-r9.

Следуя нескольким указателям в сети, как настроить среду, у меня есть следующая настройка.

  1. Свойства конфигурации -> C/C++ -> Общие -> Дополнительные включаемые каталоги -> Путь к заголовочной папке из SDK.
  2. Свойства конфигурации -> C/C++ -> Препроцессор -> Определения препроцессора -> WIN32 _DEBUG _CONSOLE WPCAP HAVE_REMOTE
  3. Свойства конфигурации -> Компоновщик -> Общие -> Каталог дополнительной библиотеки -> Путь к папке библиотеки из SDK.
  4. Свойства конфигурации -> Компоновщик -> Ввод -> Дополнительные зависимости -> wpcap.lib Packet.lib

DLL из релиза exe устанавливается в C:\Windows\System32\Npcap. Система — Windows 10 Домашняя.

Вопрос:

Приведенная выше программа компилируется нормально.

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 ++, я погуглил и нашел простейшую технику, просто решив проблему, я скопировал 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 вызывает проблему.

Спасибо за время.


person baba.kabira    schedule 04.08.2016    source источник


Ответы (1)


Судя по конфигурации, ваша HelloWorld.exe — это 32-разрядная (x86) программа. Я предполагаю, что вы используете ОС Windows x64, поэтому C:\Windows\System32\Npcap для x64 DLL. И C:\Windows\SysWOW64\Npcap для x86 DLL.

Вы получили ошибку 0xc000007b, потому что ваш x86 HelloWorld.exe пытается загрузить библиотеки Npcap x64, что определенно неправильно.

Таким образом, решение состоит в том, чтобы скопировать библиотеки DLL (wpcap.dll, Packet.dll) из C:\Windows\SysWOW64\Npcap в папку, в которой был создан файл .exe.

Другой способ — добавить C:\Windows\System32 к переменной окружения PATH. Таким образом, ваши двоичные файлы x86 и x64 всегда найдут правильные библиотеки DLL Npcap, независимо от того, где они находятся.

person Yang Luo    schedule 04.08.2016