dll中函数声明
int __stdcall XnfsCtrl_Install(int bNowStartDriver, char *szDriverFilePath)
我在nsis脚本中调用该函数的写法  StrCpy $0 1
  StrCpy $1 "$INSTDIR\SHSecdrv.sys"
  StrCpy $2 ""
  System::Call '$INSTDIR\CommSecDoc.dll::XnfsCtrl_Install(i , t) i(r0,r1).r2'我这个函数是第三方dll装他提供的驱动的, 我安装的过程已经把dll和驱动都解压到安装目录下了,这样调用
r2返回值一直 是 error 
不知道哪写错了,帮助文档瞧了好几遍就是没瞧懂
哪位大神给指点指点啊,是不是这被调用的dll有什么特殊要求什么的nsisdll

解决方案 »

  1.   

    就看你这代码看不出问题
    你确定$INSTDIR\CommSecDoc.dll存在?
      

  2.   

    你确定导出的函数名是XnfsCtrl_Install?
      

  3.   

    我用Messagebox  停下来 在那安装目录是有那个dll的  
      

  4.   

    查看一下错误信息,是否依赖其他dll没有拷贝过去
      

  5.   

    请问怎样查看错误信息了,返回值 书出来就 error
    这个dll是用来与 驱动 irp通信用的,不依赖其他另外的非系统dll了
      

  6.   

    ; 该脚本使用 HM VNISEdit 脚本编辑器向导产生
    !AddPluginDir .
    ; 安装程序初始定义常量
    !define PRODUCT_NAME "TEST"
    !define PRODUCT_VERSION "1.0"
    !define PRODUCT_WEB_SITE ""
    !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\TEST.exe"
    !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
    !define PRODUCT_UNINST_ROOT_KEY "HKLM"SetCompressor lzma; ------ MUI 现代界面定义 (1.67 版本以上兼容) ------
    !include "MUI.nsh"; MUI 预定义常量
    !define MUI_ABORTWARNING
    !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
    !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"; 欢迎页面
    !insertmacro MUI_PAGE_WELCOME
    ; 安装目录选择页面
    !insertmacro MUI_PAGE_DIRECTORY
    ; 安装过程页面
    !insertmacro MUI_PAGE_INSTFILES
    ; 安装完成页面
    !insertmacro MUI_PAGE_FINISH; 安装卸载过程页面
    !insertmacro MUI_UNPAGE_INSTFILES; 安装界面包含的语言设置
    !insertmacro MUI_LANGUAGE "SimpChinese"; 安装预释放文件
    !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
    ; ------ MUI 现代界面定义结束 ------Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
    OutFile "Setup.exe"
    InstallDir "$PROGRAMFILES\HWSFM"
    InstallDirRegKey HKLM "${PRODUCT_UNINST_KEY}" "UninstallString"
    ShowInstDetails show
    ShowUnInstDetails show
    BrandingText "TEST"
    RequestExecutionLevel adminSection "MainSection" SEC01
      SetOutPath "$INSTDIR"
      SetOverwrite ifnewer
      File "G:\TEST\Release\TEST.exe"
      CreateDirectory "$SMPROGRAMS\TEST"
      CreateShortCut "$SMPROGRAMS\HWSFM\TEST.lnk" "$INSTDIR\TEST.exe"
      CreateShortCut "$DESKTOP\TEST.lnk" "$INSTDIR\TEST.exe"
      File "G:\TEST\Release\CommSecDoc.dll"
      File "G:\TEST\Release\SHSecdrv.sys"
    SectionEndSection -AdditionalIcons
      SetOutPath $INSTDIR
      CreateShortCut "$SMPROGRAMS\HWSFM\Uninstall.lnk" "$INSTDIR\uninst.exe"
      StrCpy $0 1
      StrCpy $1 "$INSTDIR\SHSecdrv.sys"
      StrCpy $2 ""
      System::Call '$INSTDIR\CommSecDoc.dll::XnfsCtrl_Install(i , t) i(r0,r1).r2'
      MessageBox MB_YESNO "提示:R0:$0,R1:$1,R2:$2"
    SectionEndSection -Post
    ;写卸载注册表
    SectionEnd代码是向导生成的 我只在Section -AdditionalIcons 添加了部分的代码
    如果在TEST.EXE启动时直接调用安装函数,那样把3个文件打包是可以直接用的不行我就只能继续完善我那win32写的安装包了
      

  7.   


    SetOutPath $INSTDIR
    File CommSecDoc.dll
    System::Call 'CommSecDoc::XnfsCtrl_Install(i1, t"$INSTDIR\SHSecdrv.sys")i.r2'
    ${If} $2 == "error"
      System::Call Kernel32::GetLastError()i.r2
      MessageBox MB_ICONINFORMATION|MB_OK "$2"
    ${EndIf}
    我就知道下面这两种情况肯定是返回error的
    126 The specified module could not be found.  ERROR_MOD_NOT_FOUND 
    127 The specified procedure could not be found.  ERROR_PROC_NOT_FOUND 
      

  8.   


    谢谢楼上的提醒,让我突然想起这个dll是不是没有导出函数名,无法被 System::call 查找到函数从而无法调用,结果用depands一看还真是的。。唉,有时候脑子真转不过弯来,一直以为是nsis脚本没写对 好了,结贴了,既然脚本没写错,就只能另想办法了
      

  9.   

    加个def吧
    LIBRARY CommSecDoc
    EXPORTS
      XnfsCtrl_Install