Создание примера кода LSP от Microsoft - PullRequest
1 голос
/ 29 марта 2011

Здание с / Использование VS2010 Платформа 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 ]

2 голосов
/ 29 марта 2011

Файл lspcommon.h является частью примера LSP, вы должны быть в состоянии найти его в подпапке «common». (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 в список определений препроцессора.

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


Ошибка 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.

1 голос
/ 29 марта 2011

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

0 голосов
/ 29 марта 2011

Попробуйте изменить #include <nt.h> на #include <winnt.h> и посмотрите, будет ли он построен.

...