Help needed one using OCX requiring license
Simon Dong -- simon.dong@quintus.com
Thursday, January 04, 1996
Hi All,
I am using a OLE control (Sheridan Tab Control to be specific) in my VC4 MFC
application. It is use as a child window of a non-dialog window. I use the
Componet Gallery-created wrapper class to create and access the control. It
runs fine in my work station because I install the Sheridan package so I
have all the licensing info on my machine. But when I give the app to other
people and let them register thc OCX using regsvr32.exe on their machines
the OCX pops up a message box saying it's not licensed for design time use.
I did some research in MSDN and Adam Henning's 'OLE Control inside and out'
and realized there's a parameter in CWnd::CreateControl I can pass in a BSTR
and the license key. Here's what I did.
I queried the IClassFactory2 interface from OCX object using
::CoGetClassObject() and called the RequestLicKey() to get a copy of the
runtime license key. I saved it then I created a constant in my code
containing the key:
const WCHAR strLicKey = {
... The value of the key I got using RequestLicKey ...
};
I passed the key as the last parameter in the CWnd::CreateControl call and
got a crash in the Kernel32, either with or without the OCX package
installed on the machine. (The OCX is registered when it not installed). I
know I probably need to call GetLicInfo() to test fLicVerified in the
LICINFO structure and not pass in the key when it's already being verified,
but the not licensed for design use message box even poped up when I tried
to call GetLicInfo(). Beside that what else is wrong. Does anyone has any
idea or pointer to any examples?
BTW, I also tried in VB. The exe generated by VB runs fine when I uninstall
the OCX package and register the controls needed.
TIA. Any help is appreciated.
Simon Dong
simon@quintus.com
John & Annette Elsbree -- elsbree@msn.com
Tuesday, January 09, 1996
Simon -
Good detective work. You are *almost* there. The last obstacle is the
difference between a BSTR and a pointer to WCHAR.
A BSTR can be treated as a WCHAR*, but not the other way around. Here's why: a
BSTR is actually a pointer to the first WCHAR in the string, but there's
additional data about the BSTR stored at a negative offset from the pointer.
If that data isn't present, then any operation that depends on it will have
unpredictable results.
So:
BSTR bstr = FunctionReturningBstr();
WCHAR* pwch = bstr;
int nLength = wcslen(pwch);
...is ok, but:
WCHAR* pwch = FunctionReturningWideString();
BSTR bstr = (BSTR)pwch; // bogus cast!
int nLength = SysStringLen(bstr);
...is not.
To create a BSTR from a WCHAR*, call SysAllocString. When you're done with the
BSTR, be sure to call SysFreeString.
BSTR bstr = SysAllocString(L"license string here");
CreateControl(..., bstr);
SysFreeString(bstr);
That should get you going.
When you use a licensed control in the dialog editor, the license key is
automatically extracted and encoded in the corresponding DLGINIT resource.
However, when you're creating controls from code, you do need to manually
include the license key in your code. Sorry we didn't have this whole
procedure documented better... we're already working to remedy that.
mfcTeam.m_johnels; // does not represent Microsoft
----------
From: owner-mfc-l@netcom.com on behalf of Simon Dong
I am using a OLE control (Sheridan Tab Control to be specific) in my VC4 MFC
application. It is use as a child window of a non-dialog window. I use the
Componet Gallery-created wrapper class to create and access the control. It
runs fine in my work station because I install the Sheridan package so I
have all the licensing info on my machine. But when I give the app to other
people and let them register thc OCX using regsvr32.exe on their machines
the OCX pops up a message box saying it's not licensed for design time use.
I did some research in MSDN and Adam Henning's 'OLE Control inside and out'
and realized there's a parameter in CWnd::CreateControl I can pass in a BSTR
and the license key. Here's what I did.
I queried the IClassFactory2 interface from OCX object using
::CoGetClassObject() and called the RequestLicKey() to get a copy of the
runtime license key. I saved it then I created a constant in my code
containing the key:
const WCHAR strLicKey = {
... The value of the key I got using RequestLicKey ...
};
I passed the key as the last parameter in the CWnd::CreateControl call and
got a crash in the Kernel32, either with or without the OCX package
installed on the machine. (The OCX is registered when it not installed). I
know I probably need to call GetLicInfo() to test fLicVerified in the
LICINFO structure and not pass in the key when it's already being verified,
but the not licensed for design use message box even poped up when I tried
to call GetLicInfo(). Beside that what else is wrong. Does anyone has any
idea or pointer to any examples?
BTW, I also tried in VB. The exe generated by VB runs fine when I uninstall
the OCX package and register the controls needed.
| Вернуться в корень Архива
|