Search code examples
inno-setupnsis

Calling an Inno setup plugin from NSIS


I'm trying to use an Inno setup plugin called webcrtl (a web browser with more features than nsweb). I'm trying to call this dll with the system plugin.

The plugin:

http://restools.hanzify.org/article.asp?id=90

This is what I'm trying, without success:

Page custom Pre

Var hCtl_dialog
Var browser
Function Pre
    InitPluginsDir
    File "${BASEDIR}/Plugins/inno_webctrl_v2.1/webctrl.dll"

    nsDialogs::Create 1018
    Pop $hCtl_dialog

    System::Call "webctrl::NewWebWnd(i $HWNDPARENT, i 100, i 100, i 200, i 200) i .s"
    Pop $browser
    System::Call "webctrl::DisplayHTMLPage(i '$browser', t  'http://www.google.com/') i .s"
    Pop $R0

    nsDialogs::Show $hCtl_neoinstaller_genericcustom
FunctionEnd

I'm getting an empty page...


Solution

  • DLL library function names are case sensitive, and you have used aliases instead of the function names from that InnoSetup script. Modify your script, so that will use function names with proper case sensitivity and you'll get your script to work. The name of a function to be imported, is the word before the @ char from the external keyword import tail. For instance, in the following function import sample, the name of the imported function is newwebwnd, not NewWebWnd:

    function NewWebWnd(hWndParent: HWND; X, Y, nWidth, nHeight: Integer): HWND;
      external 'newwebwnd@files:webctrl.dll stdcall';
    

    So in your case, modify the function names the following way and you should be fine:

    ...
      System::Call "webctrl::newwebwnd(i $hCtl_dialog, i 0, i 0, i 150, i 150) i.s"
      Pop $browser
      System::Call "webctrl::displayhtmlpage(i $browser, t 'http://www.google.com/') b.s"
      Pop $R0
    ...
    

    The whole script for the WebCtrl control stretched inside the install page might then look like this:

    !include "nsDialogs.nsh"
    
    OutFile "Setup.exe"
    RequestExecutionLevel user
    InstallDir $DESKTOP\WebBrowserSetup
    
    Page directory
    Page custom InitializeWebBrowserPage
    
    var hDialog
    var hBrowser
    Function InitializeWebBrowserPage
    
        InitPluginsDir
        SetOutPath $PLUGINSDIR
        File "webctrl.dll"
    
        nsDialogs::Create 1018
        Pop $hDialog
    
        ; get the page client width and height
        System::Call "*(i, i, i, i) i.r0"
        System::Call "user32::GetClientRect(i $hDialog, i r0)"
        System::Call "*$0(i, i, i.r1, i.r2)"
        System::Free $0
    
        ; create a web browser window stretched to the whole page client rectangle
        ; and navigate somehwere; note that you should add some error handling yet
        System::Call "webctrl::newwebwnd(i $hDialog, i 0, i 0, i $1, i $2) i.s"
        Pop $hBrowser
        System::Call "webctrl::displayhtmlpage(i $hBrowser, t 'http://www.google.com') b.s"
        Pop $R0
    
        nsDialogs::Show
    
    FunctionEnd
    
    Section ""
    SectionEnd