构建Microsoft的LSP示例代码

用/使用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 filesmicrosoft sdkswindowsv7.1samplesnetdswinsocklspnonifslsplspdef.h   22  1   LSP
   Error    7   error C1083: Cannot open include file: 'lspcommon.h': No such file or directory c:program filesmicrosoft sdkswindowsv7.1samplesnetdswinsocklspinstallinstlsp.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 FilesMicrosoft SDKsWindowsv7.1Samplesnetdswinsocklspinstlsp.obj  LSP
Error   6   error CVT1100: duplicate resource.  type:MANIFEST, name:1, language:0x0409  C:Program FilesMicrosoft SDKsWindowsv7.1SamplesnetdswinsocklspCVTRES   LSP
Error   7   error LNK1123: failure during conversion to COFF: file invalid or corrupt   C:Program FilesMicrosoft SDKsWindowsv7.1SamplesnetdswinsocklspLINK LSP
我没有更改LSP示例中的任何内容/文件。 目前我只是想建立它。 对此有任何见解会有所帮助。 谢谢。     
已邀请:
文件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
这意味着,只有在未定义宏_PSDK_BLD时才包含nt.h文件(以及其他两个)。在第35行看一下,你会看到代码看起来像这样......
#ifndef _PSDK_BLD
#include <lspcommon.h>
#else
#include "..commonlspcommon.h"
#endif
在这种情况下,如果未定义宏,则代码包含文件lspcommon.h,但如果定义了宏,则代码包含来自公共foider的文件lspcommon.h。 由于_PSDK_BLD未定义,似乎您的问题可能正在发生。从#ifdef的样式看,宏看起来不像任何特定的值,只是定义了。 在Visual Studio中,转到“项目属性”,深入查看“C / C ++”,然后查看“预处理器”。然后找到预处理器定义行并单击该值。现在选择编辑并将_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。有关详细信息,请参阅lsp中的readme.txt文件和各种文件夹中的makefile文件。 如果要在Visual Studio中构建LSP,则在解决方案中确实需要四个不同的项目,分别用于lspcommon,ifslsp,nonifslsp和install。     
将此定义添加到您的构建:_PSDK_BLD 它会解决你的问题     
尝试将
#include <nt.h>
更改为
#include <winnt.h>
,看看它是否构建。     

要回复问题请先登录注册