1
votes

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...

1
Just a few notes, since I don't know NSIS. 1) The WebCtrl is the ANSI library (non Unicode), as it's evidently shown in its import to InnoSetup, which uses PChar, what is a pointer to ANSI char in ANSI versions of InnoSetup. 2) Are you sure you want to pass $HWNDPARENT as a parent for the web control ? Shouldn't this be rather $hCtl_dialog ? 3) And finally, check the return values of the functions. - TLama
1) it's ok, I'm unis the ANSI version of NSIS. 2) I tried $hCtl_dialog first without success. Using $HWNDPARENT was an trial-and-error test. 3) I'll do it, thanks! :-D - Francisco R

1 Answers

2
votes

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