15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Invalid argument to SysFreeString causing crash

Sam Gentile -- sgentile@gensym.com
Tuesday, January 14, 1997

Environment: VC++ 4.02b, Windows NT 4.0

Mike, Help!
I have this Win32 OCX that I have building with MFC. I have an OCX Method,
that when it gets called crashes any OLE Container such as VB and causes
the following BoundsChecker error:
Invalid argument
SysFreeString, HANDLE: 0x0015345C
Bad handle

The stack shows this happens on the SysFreeString line of PushStackArgs:
ASSERT(pArgTemp->vt == VT_BSTR);
BSTR bstrW = pArgTemp->bstrVal;
pArgTemp->bstrVal = AfxBSTR2ABSTR(bstrW);
here->>>>SysFreeString(bstrW);

The stack is:
CCmdTarget::PushStackArgs(unsigned char * 0x0012f64c, unsigned char *
0x100b55a8, void * 0x0012f6f0, unsigned short 3, tagDISPPARAMS *
0x0012f76c, unsigned int * 0x0012f7a0, tagVARIANT * 0x0012f660) line 690
CCmdTarget::CallMemberFunc(const AFX_DISPMAP_ENTRY * 0x100b3788, unsigned
short 1, tagVARIANT * 0x00000000, tagDISPPARAMS * 0x0012f76c, unsigned int
* 0x0012f7a0) line 956 + 36 bytes
COleDispatchImpl::Invoke(COleDispatchImpl * const 0x017c12f0, long 10,
const _GUID & {...}, unsigned long 1033, unsigned short 1, tagDISPPARAMS *
0x0012f76c, tagVARIANT * 0x00000000, tagEXCEPINFO * 0x0012f828, unsigned
int * 0x0012f858) line 1401 + 28 byt
BCK32API! 00b4ec30()

My OLE Method is:
long CG2GateCtrl::G2Connect(LPCTSTR sMachineName, LPCTSTR sPortNumber)
{
   	gsi_int lStatus;
	char *initialization_string = "Anything"; // create a unique string here
	int connection = 0; // allocate a new connection index
	
	connection_initialization_string_table[connection] = initialization_string;

	// All calls in the GsiInterface class are thread-safe
	lStatus = m_pMyGsiInterface->GsiInitiateConnection(NULL, NULL, 0, "T", 
						(char*)sMachineName, 
			                     (char *)sPortNumber, 
						initialization_string);
}

This is happening in the Invoke, so it's as soon as this OLE Method is
called/invoked. I thought this would be solved by using the BSTR data type
to eliminate this crash, but I couldn't figure out how to convert from
LPCTSTRs to BSTRs. I asked on the microsoft.public.vc.mfcole newgroup and
someone asked me why I was even wanting to use BSTRs. They said:
You very rarely need a by-reference BSTR (which is what you have is you
have a BSTR FAR*).

I don't know what you are trying to do with this parameter. The OLE Events
tab is used to describe an event you are firing from a control to a
container. When you want to send a string parameter to the event handler,
you generally select the LPCTSTR data type selection. For such parameters
MFC applications, UNICODE and ANSI, will take your string (in ANSI for ANSI
builds or in UNICODE for UNICODE builds) and properly convert it, as
necessary to a BSTR.

I thought BSTRs were THE OLE String Data type for dealing with OLE
Automation/OCXs especially dealing with VB? Can anyone help me (Mike B?)
figure out why I'm getting this problem. I have a code deadline tommorrow!

Thanks,
Sam








Jim Murphy -- jim.murphy@aspentech.com
Thursday, January 16, 1997


I would look at the local string assignment:
        char *initialization_string = "Anything"; // create a unique string here

consider using:
         BSTR initialization_string = SysAllocString("Anything");

and pass the BSTR!



>Environment: VC++ 4.02b, Windows NT 4.0
>
>Mike, Help!
>I have this Win32 OCX that I have building with MFC. I have an OCX Method,
>that when it gets called crashes any OLE Container such as VB and causes
>the following BoundsChecker error:
>Invalid argument
>SysFreeString, HANDLE: 0x0015345C
>Bad handle
>
>The stack shows this happens on the SysFreeString line of PushStackArgs:
>ASSERT(pArgTemp->vt == VT_BSTR);
>BSTR bstrW = pArgTemp->bstrVal;
>pArgTemp->bstrVal = AfxBSTR2ABSTR(bstrW);
>here->>>>SysFreeString(bstrW);
>
>The stack is:
>CCmdTarget::PushStackArgs(unsigned char * 0x0012f64c, unsigned char *
>0x100b55a8, void * 0x0012f6f0, unsigned short 3, tagDISPPARAMS *
>0x0012f76c, unsigned int * 0x0012f7a0, tagVARIANT * 0x0012f660) line 690
>CCmdTarget::CallMemberFunc(const AFX_DISPMAP_ENTRY * 0x100b3788, unsigned
>short 1, tagVARIANT * 0x00000000, tagDISPPARAMS * 0x0012f76c, unsigned int
>* 0x0012f7a0) line 956 + 36 bytes
>COleDispatchImpl::Invoke(COleDispatchImpl * const 0x017c12f0, long 10,
>const _GUID & {...}, unsigned long 1033, unsigned short 1, tagDISPPARAMS *
>0x0012f76c, tagVARIANT * 0x00000000, tagEXCEPINFO * 0x0012f828, unsigned
>int * 0x0012f858) line 1401 + 28 byt
>BCK32API! 00b4ec30()
>
>My OLE Method is:
>long CG2GateCtrl::G2Connect(LPCTSTR sMachineName, LPCTSTR sPortNumber)
>{
>   	gsi_int lStatus;
>	char *initialization_string = "Anything"; // create a unique string here
>	int connection = 0; // allocate a new connection index
>	
>	connection_initialization_string_table[connection] = initialization_string;
>
>	// All calls in the GsiInterface class are thread-safe
>	lStatus = m_pMyGsiInterface->GsiInitiateConnection(NULL, NULL, 0, "T", 
>						(char*)sMachineName, 
>			                     (char *)sPortNumber, 
>						initialization_string);
>}
>
>This is happening in the Invoke, so it's as soon as this OLE Method is
>called/invoked. I thought this would be solved by using the BSTR data type
>to eliminate this crash, but I couldn't figure out how to convert from
>LPCTSTRs to BSTRs. I asked on the microsoft.public.vc.mfcole newgroup and
>someone asked me why I was even wanting to use BSTRs. They said:
>You very rarely need a by-reference BSTR (which is what you have is you
>have a BSTR FAR*).
>
>I don't know what you are trying to do with this parameter. The OLE Events
>tab is used to describe an event you are firing from a control to a
>container. When you want to send a string parameter to the event handler,
>you generally select the LPCTSTR data type selection. For such parameters
>MFC applications, UNICODE and ANSI, will take your string (in ANSI for ANSI
>builds or in UNICODE for UNICODE builds) and properly convert it, as
>necessary to a BSTR.
>
>I thought BSTRs were THE OLE String Data type for dealing with OLE
>Automation/OCXs especially dealing with VB? Can anyone help me (Mike B?)
>figure out why I'm getting this problem. I have a code deadline tommorrow!
>
>Thanks,
>Sam
>
>
>
>
>
>
**************************************************************************
      ||
    ||||||                   Jim Murphy
  ||||||||||                 Senior Engineer
||||||||||||||
||||||||||||||               Advanced Control & Optimization Div.
||||||||||||||               Aspen Technology Inc. 
  ||||||||||                 Houston, TX
      ||                     T(713) 313-1171 F(713) 313-1380
      ||
**************************************************************************





| Вернуться в корень Архива |