Registering a Palm Com Conduit

From NSIS Wiki

Author: lpayne (talk, contrib)


Description

Here's a quick and simple script to register conduits with the Palm HotSync Manager.

The Script

!define PRODUCT_NAME "Register Conduit Sample"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "lynn.dpl @ gmail.com"
;!define PRODUCT_WEB_SITE "http://www.palmdogs.com"
!include "MUI.nsh"
!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_INSTFILES
!insertmacro MUI_LANGUAGE "English"
 
;Palm core path
Var ExecPath
 
OutFile "RegisterConduit.exe"
InstallDir "$PROGRAMFILES\ConduitRegisterTest"
ShowInstDetails show
 
Section "MainSection"
  ; Copy the conduit. In this case it's an ActiveX.exe
  ; If it was a .dll it would be registered using the UpgradeDLL macro i.e.
  ; !insertmacro UpgradeDLL "c:\MyDir\MyConduit.dll" $INSTDIR\MyConduit.dll $INSTDIR
  SetOutPath "$INSTDIR"
  File "c:\qbConduit\ConduitDemo\MyConduit.exe"
  EXECWAIT "$INSTDIR\MyConduit.exe /regserver"
 
  ; This should return with $ExecPath set to the
  ; location of the Palm core files.
  Call GetPalmExecPath
 
  ; Now we can register the conduit
  StrCmp $ExecPath "" SkipIt
    Call RegisterCOMConduit
    Call RestartHotSyncManager
  SkipIt:
 
  SetAutoClose false
SectionEnd
 
;--------------------------------------------------------------------
;
; Function: GetPalmExecPath
;
; Description: Get the exec path for the palm components
;
; Notes: Sets global  ExecPath
;
;--------------------------------------------------------------------
Function GetPalmExecPath
  SetOutpath $TEMP\ttLP
  File "c:\Program Files\Palm\CondMgr.dll"
  StrCpy $1 ${NSIS_MAX_STRLEN}
  System::Call 'CondMgr::CmGetHotSyncExecPath(t, *i) i(.r0, r1r1).r2'
  StrCmp $2 "0" GetParentString NoPath
  GetParentString:
  Push $0
  Call GetParent    ; Strip 'HotSync.exe' off of the string
  Pop $R0
  StrCpy $ExecPath $R0
  Goto ExecDone
 
  NoPath:
  MessageBox MB_OK " Unable to get Palm Components Path."
  StrCpy $ExecPath ""
 
  ExecDone:
FunctionEnd
 
;--------------------------------------------------------------------
;
; Function: RegisterCOMConduit
;
; Description: Registers a COM conduit with HotSync Manager.
;              Writes a registry entry for the conduit in:
;              HKEY_Current_User\Software\U.S. Robotics\PilotDesktop\
;
; Uses: CondMgr.dll
;
; Note: Other conduit types register essentially the same way. See
;       the Palm documentation for more information.
;
;--------------------------------------------------------------------
Function RegisterCOMConduit
 
  ; Set the path
  StrCmp $ExecPath "" RegisterDone
  SetOutPath $ExecPath
 
  strcpy $0 "ttLP"    ; Creator ID
 
  ; Delete the old conduit if any
  System::Call 'CondMgr::CmRemoveConduitByCreatorID(t) i(r0).r2'
  ; Don't really care about the return value
 
  ; First set the creator ID of the conduit
  ; 0 = Conduit_Component, 1 = Conduit_Application, 2 = future use
  System::Call 'CondMgr::CmInstallCreator(t, i) i(r0, 0).r2'
  StrCmp $2 "0" SetName RegisterErr
 
  ; Conduit Name
  SetName:
  System::Call 'CondMgr::CmSetCreatorName(t, t) i(r0, "ComConduit.dll").r2'
  StrCmp $2 "0" SetPriority RegisterErr
 
  ; Conduit Priority
  SetPriority:
  System::Call 'CondMgr::CmSetCreatorPriority(t, i) i(r0, 2).r2'
  StrCmp $2 "0" SetTitle RegisterErr
 
  ; Conduit Title
  SetTitle:
  System::Call 'CondMgr::CmSetCreatorTitle(t, t) i(r0, "MyConduit Title").r2'
  StrCmp $2 "0" SetValue RegisterErr
 
  ; It's a COM conduit so specify the entry point. In this case it's .CNotifyDll
  SetValue:
  System::Call 'CondMgr::CmSetCreatorValueString(t, t, t) i(r0, "COMClient", "MyConduit.CNotifyDll").r2'
  StrCmp $2 "0" RegisterDone RegisterErr
 
  RegisterErr:
  MessageBox MB_OK "Error installing conduit."
 
  RegisterDone:
FunctionEnd
 
;--------------------------------------------------------------------
;
; Function: RestartHotSyncManager
;
; Description: Restarts HotSync Manager.
;
; Uses: hsAPI.dll
;
;--------------------------------------------------------------------
Function RestartHotSyncManager
 
  StrCmp $ExecPath "" RestartDone
  SetOutPath $ExecPath
 
  ; If I don't call refresh before the restart, restart sometimes fails.
  ; Always seems to work this way. A refresh really should be enough
  ; for the Conduit to be picked up but...
  DetailPrint "Refreshing HotSync Manager..."
  System::Call 'hsapi::HsRefreshConduitInfo(v) i .r2'
 
  DetailPrint "Restarting HotSync Manager..."
  System::Call 'hsapi::HsSetAppStatus(i, i) i(2, 0).r2'
  StrCmp $2 "0" RestartDone RestartErr
 
  RestartErr:
  Messagebox MB_OK "Unable to restart HotSync Manager."
 
  RestartDone:
FunctionEnd
 
;--------------------------------------------------------------------
; Function: GetParent
;--------------------------------------------------------------------
Function GetParent
   Exch $R0
   Push $R1
   Push $R2
   Push $R3
   StrCpy $R1 0
   StrLen $R2 $R0
   loop:
     IntOp $R1 $R1 + 1
     IntCmp $R1 $R2 get 0 get
     StrCpy $R3 $R0 1 -$R1
     StrCmp $R3 "\" get
     Goto loop
   get:
     StrCpy $R0 $R0 -$R1
     Pop $R3
     Pop $R2
     Pop $R1
     Exch $R0
 FunctionEnd
 
;--------------------------------------------------------------------
; End RegisterConduit.nsi
Personal tools
donate