【问题标题】:Add dependency on Shell32.lib to WDK makefile将 Shell32.lib 的依赖添加到 WDK makefile
【发布时间】:2012-05-05 00:06:05
【问题描述】:

我已经成功地完成了 WDK XPSDrv 示例项目,并对其进行了修改以满足我的需要。但是,我绝对无法弄清楚如何让构建脚本引用/包含/任何 shell32.lib。我是一个 .NET 人!这是一个奇怪而可怕的领域。

我认为添加依赖引用是我需要做的。当我编译我得到这个错误

3>errors in directory c:\winddk\7600.16385.1\src\printgit\xpsdrvsmpl\
src\filters\common
3>c:\winddk\7600.16385.1\src\printgit\xpsdrvsmpl\src\filters\common\
xdstrmflt.cpp(238) : error C3861: 'ShellExecute': identifier not found

由于我极度缺乏知识(而且很匆忙),我没有使用 Visual Studio,只是在 notepad++ 和 shell wdk 构建环境中使用简单的模块。我在 VS 中有一个代理项目,我一直在编写和测试一小段代码。在那个项目中,我向shell32.lib 添加了一个依赖库,一切正常。

有一个makefile引用了sources,内容如下。

没关系,但是需要shell32的代码是

HINSTANCE statu = ShellExecute(NULL,TEXT("open"),szTempFileName,NULL,NULL,9);

这是sources 文件。

INCLUDES=$(INCLUDES);        \
    .\;                      \
    .\..\inc;                \
    .\..\debug;              \
    $(DDK_INC_PATH);         \
    $(SDK_INC_PATH)\gdiplus; \

USE_ATL=1
USE_STL=1

ATL_VER=70
STL_VER=70

# We use STL 7.0, which is not available pre-Vista. We therefore set USE_LIBCMT=1
# If STL 7.0 is not necessary, USE_MSVCRT=1 is recommended
USE_LIBCMT=1

USE_IDLBASED_DLLDATA=1
USE_OBJECT_ROOT=1

MSC_WARNING_LEVEL=/W4 /WX

USE_NATIVE_EH=1

PRECOMPILED_CXX=1
PRECOMPILED_INCLUDE=precomp.h

# To remove debug code remove -DDBG from the line below
C_DEFINES=$(C_DEFINES) -D_UNICODE -DUNICODE

SOURCES=\
    bkpchndlr.cpp       \
    bkpthndlr.cpp       \
    bkschema.cpp        \
    cmpthndlr.cpp       \
    cmprofpthndlr.cpp   \
    cmprofpchndlr.cpp   \
    cmintpthndlr.cpp    \
    cmschema.cpp        \
    cmprofileschema.cpp \
    cmintentsschema.cpp \
    globals.cpp         \
    nupschema.cpp       \
    nupchndlr.cpp       \
    nupthndlr.cpp       \
    pchndlr.cpp         \
    pgscpchndlr.cpp     \
    pgscpthndlr.cpp     \
    pgscschema.cpp      \
    porientpthndlr.cpp  \
    porientschema.cpp   \
    psizepthndlr.cpp    \
    psizeschema.cpp     \
    pimagepthndlr.cpp   \
    pimageschema.cpp    \
    pshndlr.cpp         \
    pthndlr.cpp         \
    ptquerybld.cpp      \
    schema.cpp          \
    wmpchndlr.cpp       \
    wmpthndlr.cpp       \
    wmschema.cpp        \
    workbuff.cpp

TARGETNAME=xdsmplcmn
TARGETTYPE=LIBRARY

【问题讨论】:

    标签: c++ windows makefile wdk


    【解决方案1】:

    例如在您的sources 文件中:

    TARGETLIBS=$(SDK_LIB_PATH)\kernel32.lib $(SDK_LIB_PATH)\user32.lib $(SDK_LIB_PATH)\shell32.lib
    

    ...根据需要修改;)

    但是,您的错误实际上不是链接器错误而是编译器错误,因此您可能希望以某种方式包含声明ShellExecute 的标头,即shellapi.h .


    刚刚在我的 WDK (7600.16385.1) 中查看了示例,事实上您删除了下面复制的非常重要的部分,您只需将其他 .lib 文件附加到该部分即可链接:

    TARGETLIBS=                                  \
        $(SDK_LIB_PATH)\kernel32.lib             \
        $(SDK_LIB_PATH)\user32.lib               \
        $(SDK_LIB_PATH)\winspool.lib             \
        $(SDK_LIB_PATH)\ole32.lib                \
        $(SDK_LIB_PATH)\oleaut32.lib             \
        $(SDK_LIB_PATH)\advapi32.lib             \
        $(SDK_LIB_PATH)\msxml6.lib               \
        $(SDK_LIB_PATH)\uuid.lib                 \
        $(SDK_LIB_PATH)\Comdlg32.lib             \
        $(OBJ_PATH)\..\debug\$O\xdsdbg.lib \
        $(OBJ_PATH)\..\common\$O\xdsmplcmn.lib \
    

    ...抱歉,此示例中有很多 sources 文件,所以我当然无法真正知道您修改了哪些示例并尝试构建 :)

    【讨论】:

    • 你是圣人。我刚刚通过 astrogrepping EVERYTHING for kernel32.lib 找到了一个例子来找出源代码。不过,在我意识到这是一个编译器错误之前,我可能已经把我的头发拔掉了。
    • 我的 Visual Studio 测试应用程序中包含的标头必须在某处包含 shellapi.h,因为它不是我的测试项目中的包含,它运行良好。很奇怪。
    • @scaryman: 可能通过预编译的头文件stdafx.h 包括各种东西,包括Windows.h 和经常在#defines 之前找到#defines 的地方#include 以防止某些隐含#includes 通过Windows.h 等发生。当然,您可能一直在使用的某些 MFC/ATL/WTL 标头也可以使用shellapi.h
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2011-09-28
    • 2015-11-07
    相关资源
    最近更新 更多