Создание примера кода LSP от Microsoft

Сборка с / с использованием VS2010 Platform SDK (Microsoft Windows SDK v7.1) установлена.

Когда я пытаюсь создать образец LSP (находится в C: \ Program Files \ Microsoft Platform SDK \ Samples \ NetDS \ WinSock \ LSP)

! - НАЧАТЬ РЕШЕНИЕ--!

Я получаю 16 из тех же двух ошибок ниже.

   Error    1   error C1083: Cannot open include file: 'nt.h': No such file or directory    c:\program files\microsoft sdks\windows\v7.1\samples\netds\winsock\lsp\nonifslsp\lspdef.h   22  1   LSP
   Error    7   error C1083: Cannot open include file: 'lspcommon.h': No such file or directory c:\program files\microsoft sdks\windows\v7.1\samples\netds\winsock\lsp\install\instlsp.h    35  1   LSP

Когда я добавил исходный код этого примера в VS, я использовал File>New ProjectFrom Existing Code. Как только я это сделаю, VS начнет импортировать все включенные файлы Platform SDK. В другом месте я читал, что отсутствие включений из PSDK может вызвать проблемы, но здесь, похоже, это не так.

! - КОНЕЦ РЕШЕНО--!

Я теперь сталкиваюсь с еще 3 ошибками после исправления вышеупомянутой проблемы:

Error   1   error LNK2005: "struct _GUID gProviderGuid" (?gProviderGuid@@3U_GUID@@A) already defined in lspguid.obj C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\netds\winsock\lsp\instlsp.obj  LSP
Error   6   error CVT1100: duplicate resource.  type:MANIFEST, name:1, language:0x0409  C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\netds\winsock\lsp\CVTRES   LSP
Error   7   error LNK1123: failure during conversion to COFF: file invalid or corrupt   C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\netds\winsock\lsp\LINK LSP

Я не менял содержимое / файлы в образце LSP.

В настоящее время я просто пытаюсь его построить.

Любое понимание этого было бы полезно.

Благодарю.

3 ответа

Файл lspcommon.h является частью примера LSP, вы должны найти его в "обычной" подпапке. (C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\netds\winsock\lsp\common)

Если вы дважды щелкните по одной из ваших ошибок, редактор откроется, сосредоточившись на строке, которая вызывает проблемы. Сделайте это для lspdef.h, строка 22, и вы увидите, что код выглядит следующим образом...

#ifndef _PSDK_BLD
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#endif

Это означает, что файл nt.h (и два других) включается, только если макрос _PSDK_BLD не определен. Посмотрите немного ниже на строку 35, и вы увидите, что код выглядит следующим образом...

#ifndef _PSDK_BLD
#include <lspcommon.h>
#else
#include "..\common\lspcommon.h"
#endif

В этом случае, если макрос не определен, код включает файл lspcommon.h, но если макрос определен, то код включает файл lspcommon.h от общего фойдера.

Вероятно, тогда возникнут ваши проблемы, потому что _PSDK_BLD не определен. Из стиля #ifdef не похоже, что макрос должен быть определен с каким-то конкретным значением, только что определенным.

В Visual Studio перейдите в Свойства проекта, перейдите к C/C++ и затем Препроцессор. Затем найдите строку определений препроцессора и щелкните по значению. Теперь выберите edit и добавьте _PSDK_BLD в список определений препроцессора.

Следите за этим главным подчеркиванием и не забудьте внести изменения в конфигурации Debug и Release (и для всех платформ, которые вы, возможно, определили)


Ошибка LNK2005 означает, что компоновщик нашел два определения для объекта, который он пытается связать, что является проблемой, поскольку у компоновщика нет возможности определить, какое из двух определений он должен использовать.

В данном конкретном случае объект, который пытается разрешить компоновщик, - это "struct _GUID gProviderGuid". Если вы посмотрите в файлах instlsp.h, lspdef.h (оба) и lspcommon.h, вы увидите код, который выглядит следующим образом

extern GUID                 gProviderGuid;

Это объявляет внешнюю переменную с именем gProviderGuid типа GUID (которая является структурой). Компоновщик должен разрешить эту внешнюю ссылку в любом файле, который включает один из этих заголовочных файлов, а затем сделал ссылку на gProviderGuid.

Из части "уже определенной в lspguid.obj" ошибки мы знаем, что компоновщик заглянул внутрь файла lspguid.obj и нашел определение gProviderGuid. Конечно же, если мы заглянем внутрь lspguid.cpp, мы увидим определение gProviderGuid со значением, начинающимся с 0xc5fabbd0.

Из части "C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\netds\winsock\lsp\instlsp.obj" мы знаем, что компоновщик также заглянул в файл instlsp.obj и нашел второе определение gProviderGuid. Если мы заглянем внутрь intlsp.cpp, то увидим другое определение gProviderGuid (на этот раз без какого-либо значения).

Тогда проблема заключается в том, что компоновщик просматривает как lspguid.obj, так и intlsp.obj и находит противоречивые определения gProviderGuid.

Эти два файла не должны быть частью одной сборки, поэтому мы не должны ожидать, что один запуск компоновщика прочитает их оба одновременно.

Проект LSP состоит из четырех частей: lspcommon, который используется для создания статической библиотеки lspcommon.lib; ifslsp, который используется для генерации файла ifslsp.dll; nonifslsp, который используется для генерации файла nonifslsp.dll, и установка, которая используется для генерации файла Instlsp.exe. См. Файл readme.txt в lsp и файлы makefile в различных папках для получения более подробной информации.

Если вы собираетесь создавать LSP в Visual Studio, вам действительно нужно четыре разных проекта в своем решении, по одному для lspcommon, ifslsp, nonifslsp и install.

Добавьте это определение к вашей сборке: _PSDK_BLD Это решит вашу проблему

Попробуйте изменить #include <nt.h> в #include <winnt.h> and see if it builds.

Другие вопросы по тегам