构建Microsoft的LSP示例代码

时间:2011-03-28 23:50:28

标签: c++ visual-studio winsock-lsp

使用/使用VS2010构建 已安装Platform SDK(Microsoft Windows SDK v7.1)。

当我尝试构建Sample 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 个答案:

答案 0 :(得分:2)

文件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 "..\common\lspcommon.h"
#endif

在这种情况下,如果未定义宏,则代码包含文件lspcommon.h,但如果宏,则代码包含来自公共foider的文件lspcommon.h。 / p>

似乎您的问题正在发生,因为_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。

答案 1 :(得分:1)

将此定义添加到您的构建:_PSDK_BLD 它会解决你的问题

答案 2 :(得分:0)

尝试将#include <nt.h>更改为#include <winnt.h>并查看是否构建。