Hi all, I hope this is the right place.
I've got a small OCX with only about four functions. I've run both the TypeLib and the COM Browser to generate the include file and they give me the same thing. Using Jose's OLE wrapper, I was able to get it to display the control on a modal dialog.
There are no compile errors however when I get the OBJRESULT back it's &H8000FFFF which comes back with the message "Catastrophic Failure". That tells me nothing. Without further adieu, I'm posting the code to see if anyone can figure out what I might be doing wrong.
Thanks,
Stone
#Compile Exe "HaptekTest"
#tools on
#debug error on
#INCLUDE "OLECON.INC"
#include "Haptek.inc"
%txtResponse = 101
%txtInput = 102
%pic1 = 103
%pic2 = 104
%ID_Haptek = 105
global HapEvents as Int__DActiveHaptekXEvents
global Hap as Int__DActiveHaptekX
function pbmain() as long
LOCAL hDlg AS LONG
OC_WinInit
Dialog New Pixels, 0, "A.L.E.X.I.S.", 0, 0, 1048, 602, %ws_sysmenu To hDlg
Control Add TextBox, hDlg, %txtResponse, "", 808, 8, 233, 121, %es_readonly or %es_left or %es_multiline or %ws_border
Control Add TextBox, hDlg, %txtInput, "", 808, 128, 233, 21
Control Add Button, hDlg, %idok, "&Send", 824, 192, 49, 25, %bs_default
Control Add Button, hDlg, %idcancel, "&Quit", 824, 220, 49, 25
CONTROL ADD $OC_CLASSNAME, hDlg, %ID_Haptek, $PROGID_ACTIVEHAPTEKXLib_ActiveHaptekX1, 0, 0, 801, 601, %WS_VISIBLE OR %WS_CHILD
DIALOG SHOW MODAL hDlg CALL DlgProc
end function
CALLBACK FUNCTION DlgProc() AS LONG
SELECT CASE CB.MSG
CASE %WM_INITDIALOG
' Get the IDispatch of the control
Hap = newcom $PROGID_ACTIVEHAPTEKXLib_ActiveHaptekX1
'Hap = newcom $IID_ACTIVEHAPTEKXLib_Int__DActiveHaptekX
'var$ = ucode$("\load [file= [data/DefaultAXPlayerStartup.hap] i0= 1]")
var$ = ucode$("current directory")
'var$ = "\loadbackgrnd [file= g:/pbwin90/haptek/halwinback.jpg]"
IF ISOBJECT(Hap) THEN
object let Hap.Query = var$
object get Hap.QueryReturn() to x$
msgbox objresult$(objresult)
msgbox x$
END IF
CASE %WM_COMMAND
SELECT CASE CB.CTL
CASE %IDOK
IF CBCTLMSG = %BN_CLICKED THEN
Object call Hap.AboutBox()
msgbox objresult$(objresult)
END IF
CASE %IDCANCEL
IF CB.CTLMSG = %BN_CLICKED THEN DIALOG END CB.HNDL, 0
END SELECT
END SELECT
end function
The include:
' Generated by: PowerBASIC COM Browser v.2.00.0058
' DateTime : 1/18/2009 at 2:33 PM
' ------------------------------------------------
' Library Name: ACTIVEHAPTEKXLib
' Library File: C:\Program Files\Haptek\player\ActiveHaptekX.ocx
' Description : ActiveHaptekX ActiveX Control module
' Help File : C:\Program Files\Haptek\player\ActiveHaptekX.hlp
' Help Context : 0
' GUID : {C6DC0AE2-A7BE-11D2-BDF1-0090271F4931}
' LCID : 0
' Version : 1.0
' Version Dependant ProgID's
$PROGID_ACTIVEHAPTEKXLib_ActiveHaptekX1 = "ACTIVEHAPTEKX.ActiveHaptekXCtrl.1"
' Class Indentifiers
$CLSID_ACTIVEHAPTEKXLib_ActiveHaptekX = GUID$("{C6DC0AE5-A7BE-11D2-BDF1-0090271F4931}")
$CLSID_ACTIVEHAPTEKXLib_Event__DActiveHaptekXEvents = GUID$("{2CDEFD5B-B792-421B-B983-41968A9059BD}")
' Interface Indentifiers
$IID_ACTIVEHAPTEKXLib_Int__DActiveHaptekX = GUID$("{C6DC0AE3-A7BE-11D2-BDF1-0090271F4931}")
$IID_ACTIVEHAPTEKXLib_Int__DActiveHaptekXEvents = GUID$("{C6DC0AE4-A7BE-11D2-BDF1-0090271F4931}")
' Interface Name : Int__DActiveHaptekX
' Description : Dispatch interface for ActiveHaptekX Control
' ClassID : $CLSID_ACTIVEHAPTEKXLib_ActiveHaptekX
Interface IDBind Int__DActiveHaptekX
Member Call AboutBox <-552> ()
Member Get HyperText <1> () As String
Member Let HyperText <1> ()
Member Get Query <2> () As String
Member Let Query <2> ()
Member Get QueryReturn <3> () As String
Member Let QueryReturn <3> ()
End Interface
' Interface Name : Int__DActiveHaptekXEvents
' Description : Event interface for ActiveHaptekX Control
' ClassID : $CLSID_ACTIVEHAPTEKXLib_Event__DActiveHaptekXEvents
Class Class_Int__DActiveHaptekXEvents $CLSID_ACTIVEHAPTEKXLib_Event__DActiveHaptekXEvents As Event
Interface Int__DActiveHaptekXEvents $IID_ACTIVEHAPTEKXLib_Int__DActiveHaptekXEvents
Inherit IDispatch
End Interface
End Class
When using my OLE container to host the OCX, you don't retrieve a reference to the dispatch interface using:
' Get the IDispatch of the control
Hap = newcom $PROGID_ACTIVEHAPTEKXLib_ActiveHaptekX1
but
LOCAL hCtl AS DWORD
CONTROL HANDLE CB.HNDL, %ID_Haptek TO hCtl
Hap = OC_GetDispatch(hCtl)
Hey Jose,
Has anyone ever told you that you are a genius? It works perfectly!!!
Thank you so much!
Randal -- Your number one worshiper.