O.K., returning to this and inspecting the code in the crashed area with more 
time:

   orexxole.cpp, lines # 2325-2329

       for (iFuncVarIdx = 0; iFuncVarIdx < pTypeAttr->cVars; ++iFuncVarIdx)  // 
line # 2325
        {
            hResult = pTypeInfo->GetVarDesc(iFuncVarIdx, &pVarDesc);         // 
line # 2327

            hResult = pTypeInfo->GetDocumentation(pVarDesc->memid, &bstrName, 
NULL, NULL, NULL); // line # 2329

hResult in line # 2327 is set to: "RPC_E_CALL_REJECTED: Call was rejected by callee.", as a result pVarDesc is NULL causing the crash in line # 2329.

So wondering whether creating a block that only gets executed if hResult of line # 2327 is S_OK, i.e. moving # lines 2327 ff into it would be an acceptable solution?

---

The application in question is AutoCAD which takes a long time to start. (In some runs no error occurs but interacting with the OLEObject does not work like "myapp~visible=.true" to make it visible would not work and cause an exception.)

---rony


On 11.05.2022 17:20, Rony G. Flatscher wrote:

While running this simple ooRexx code, sometimes a crash in orexxole happens:

    say "... creating AutoCAD.Application"
    myApp = .oleobject~new("AutoCAD.Application")

AutoCAD needs quite a long time to get loaded.

Threads:

    Not Flagged         17016   0       Worker Thread   
ntdll.dll!TppWorkerThread       ntdll.dll!NtWaitForWorkViaWorkerFactory Normal
    *Not Flagged > 6512 0 Main Thread Main Thread orexxole.dll!fExploreTypeAttr 
Normal*
    Not Flagged         16852   0       Worker Thread   
ntdll.dll!TppWorkerThread       ntdll.dll!NtWaitForWorkViaWorkerFactory Normal
    Not Flagged         21536   0       Worker Thread   
ntdll.dll!TppWorkerThread       ntdll.dll!NtWaitForWorkViaWorkerFactory Normal
    Not Flagged         23708   0       Worker Thread   ANSI64.dll thread       
ANSI64.dll!0000000056bd2390     Normal
    Not Flagged         8812    0       Worker Thread   
combase.dll!CRpcThreadCache::RpcWorkerThreadEntry       
combase.dll!WaitCoalesced       Normal
    Not Flagged         5528    0       Worker Thread   
ntdll.dll!TppWorkerThread       ntdll.dll!NtWaitForWorkViaWorkerFactory Normal
    Not Flagged         20300   0       Worker Thread   
ntdll.dll!TppWorkerThread       ntdll.dll!NtWaitForWorkViaWorkerFactory Normal

Here The Call Stack:

    *> orexxole.dll!fExploreTypeAttr(ITypeInfo * pTypeInfo=0x000001fdec7e54a8, 
tagTYPEATTR *
    pTypeAttr=0x000001fde96650c0, _OLECLASSINFO * pClsInfo=0x000001fde962d810) 
Line 2329 C++****orexxole.dll!fExploreTypeInfo(ITypeInfo * 
pTypeInfo=0x000001fde962e0a8, _OLECLASSINFO *
    pClsInfo=0x000001fde962d810) Line 2507 
C++****orexxole.dll!OLEObject_Init_impl(RexxMethodContext_ * 
context=0x0000000c2a6acc98,
    _RexxObjectPtr * self=0x000001fdeb7aebd0, const char * 
pszArg=0x000001fdeb79e724, const char *
    eventString=0x0000000000000000, _RexxObjectPtr * 
getObjectFlag=0x0000000000000000) Line 3036 
C++****orexxole.dll!OLEObject_Init(RexxMethodContext_ * 
context=0x0000000c2a6acc98, _ValueDescriptor
    * arguments=0x0000000c2a6acb80) Line 2738 C++***    
rexx.dll!NativeActivation::run(MethodClass * _method=0x000001fdeb710a20, 
NativeMethod * _code=0x000001fdeb713630, RexxObject * _receiver=0x000001fdeb7aebd0, 
RexxString * _msgname=0x000001fdeb571660, RexxObject * * 
_arglist=0x000001fdec3a3128, unsigned __int64 _argcount=1, ProtectedObject & 
resultObj={...}) Line 1307       C++
        rexx.dll!NativeMethod::run(Activity * activity=0x000001fdeb791cb0, 
MethodClass * method=0x000001fdeb710a20, RexxObject * receiver=0x000001fdeb7aebd0, 
RexxString * messageName=0x000001fdeb571660, RexxObject * * 
argPtr=0x000001fdec3a3128, unsigned __int64 count=1, ProtectedObject & 
result={...}) Line 329     C++
        rexx.dll!MethodClass::run(Activity * activity=0x000001fdeb791cb0, 
RexxObject * receiver=0x000001fdeb7aebd0, RexxString * msgname=0x000001fdeb571660, 
RexxObject * * argPtr=0x000001fdec3a3128, unsigned __int64 count=1, ProtectedObject 
& result={...}) Line 172   C++
        rexx.dll!RexxObject::messageSend(RexxString * msgname=0x000001fdeb571660, 
RexxObject * * arguments=0x000001fdec3a3128, unsigned __int64 count=1, 
ProtectedObject & result={...}) Line 902   C++
        rexx.dll!RexxObject::sendMessage(RexxString * message=0x000001fdeb571660, 
RexxObject * * args=0x000001fdec3a3128, unsigned __int64 argCount=1, 
ProtectedObject & result={...}) Line 510     C++
        rexx.dll!RexxClass::completeNewObject(RexxObject * 
obj=0x000001fdeb7aebd0, RexxObject * * initArgs=0x000001fdec3a3128, unsigned 
__int64 argCount=1) Line 1899   C++
        rexx.dll!RexxObject::newRexx(RexxObject * * 
arguments=0x000001fdec3a3128, unsigned __int64 argCount=1) Line 2672        C++
        rexx.dll!CPPCode::run(Activity * activity=0x000001fdeb791cb0, MethodClass * 
method=0x000001fdeb570d10, RexxObject * receiver=0x000001fdeb70dd20, RexxString * 
messageName=0x000001fdeb79e690, RexxObject * * argPtr=0x000001fdec3a3128, unsigned 
__int64 count=1, ProtectedObject & result={...}) Line 147  C++
        rexx.dll!MethodClass::run(Activity * activity=0x000001fdeb791cb0, 
RexxObject * receiver=0x000001fdeb70dd20, RexxString * msgname=0x000001fdeb79e690, 
RexxObject * * argPtr=0x000001fdec3a3128, unsigned __int64 count=1, ProtectedObject 
& result={...}) Line 172   C++
        rexx.dll!RexxObject::messageSend(RexxString * msgname=0x000001fdeb79e690, 
RexxObject * * arguments=0x000001fdec3a3128, unsigned __int64 count=1, RexxClass * 
startscope=0x000001fdeb56b8c0, ProtectedObject & result={...}) Line 955        
C++
        rexx.dll!RexxActivation::forward(RexxObject * 
target=0x000001fdeb70dd20, RexxString * message=0x000001fdeb79e690, RexxClass * 
superClass=0x000001fdeb56b8c0, RexxObject * * arguments=0x000001fdec3a3128, 
unsigned __int64 argcount=1, bool continuing=false) Line 1280 C++
        rexx.dll!RexxInstructionForward::execute(RexxActivation * 
context=0x000001fdeb7ae170, ExpressionStack * stack=0x000001fdeb7ae2d8) Line 
235      C++
        rexx.dll!RexxActivation::run(RexxObject * _receiver=0x000001fdeb70dd20, 
RexxString * name=0x000001fdeb79e690, RexxObject * * _arglist=0x000001fdec3a3128, 
unsigned __int64 _argcount=1, RexxInstruction * start=0x0000000000000000, 
ProtectedObject & resultObj={...}) Line 594     C++
        rexx.dll!RexxCode::run(Activity * activity=0x000001fdeb791cb0, MethodClass 
* method=0x000001fdeb70f490, RexxObject * receiver=0x000001fdeb70dd20, RexxString * 
msgname=0x000001fdeb79e690, RexxObject * * argPtr=0x000001fdec3a3128, unsigned 
__int64 argcount=1, ProtectedObject & result={...}) Line 211  C++
        rexx.dll!MethodClass::run(Activity * activity=0x000001fdeb791cb0, 
RexxObject * receiver=0x000001fdeb70dd20, RexxString * msgname=0x000001fdeb79e690, 
RexxObject * * argPtr=0x000001fdec3a3128, unsigned __int64 count=1, ProtectedObject 
& result={...}) Line 172   C++
        rexx.dll!RexxObject::messageSend(RexxString * msgname=0x000001fdeb79e690, 
RexxObject * * arguments=0x000001fdec3a3128, unsigned __int64 count=1, 
ProtectedObject & result={...}) Line 902   C++
        rexx.dll!ExpressionStack::send(RexxString * message=0x000001fdeb79e690, 
unsigned __int64 count=1, ProtectedObject & result={...}) Line 80   C++
        rexx.dll!RexxExpressionMessage::evaluate(RexxActivation * 
context=0x000001fdeb7ad710, ExpressionStack * stack=0x000001fdeb7ad878) Line 
191      C++
        rexx.dll!RexxInstructionAssignment::execute(RexxActivation * 
context=0x000001fdeb7ad710, ExpressionStack * stack=0x000001fdeb7ad878) Line 
129   C++
        rexx.dll!RexxActivation::run(RexxObject * _receiver=0x0000000000000000, 
RexxString * name=0x000001fdeb798460, RexxObject * * _arglist=0x000001fdeb797cc0, 
unsigned __int64 _argcount=0, RexxInstruction * start=0x0000000000000000, 
ProtectedObject & resultObj={...}) Line 594     C++
        rexx.dll!RexxCode::call(Activity * activity=0x000001fdeb791cb0, 
RoutineClass * routine=0x000001fdeb7ad6d0, RexxString * 
routineName=0x000001fdeb798460, RexxObject * * argPtr=0x000001fdeb797cc0, unsigned 
__int64 argcount=0, RexxString * calltype=0x000001fdeb5def00, RexxString * 
environment=0x000001fdeb7767a0, ActivationContext context=PROGRAMCALL, 
ProtectedObject & result={...}) Line 188       C++
        rexx.dll!RoutineClass::runProgram(Activity * activity=0x000001fdeb791cb0, 
RexxObject * * arguments=0x000001fdeb797cc0, unsigned __int64 argCount=0, 
ProtectedObject & result={...}) Line 265        C++
        rexx.dll!CallProgramDispatcher::run() Line 242  C++
        rexx.dll!NativeActivation::run(ActivityDispatcher & dispatcher={...}) 
Line 1641     C++
        rexx.dll!Activity::run(ActivityDispatcher & target={...}) Line 3313 C++
        rexx.dll!CallProgram(RexxThreadContext_ * c=0x000001fdeb791cd8, const 
char * p=0x000001fde959d54d, _RexxArrayObject * a=0x000001fdeb797c60) Line 516  
  C++
        rexx.exe!RexxThreadContext_::CallProgram(const char * 
n=0x000001fde959d54d, _RexxArrayObject * a=0x000001fdeb797c60) Line 999   C++
        rexx.exe!main(int argc=2, char * * argv=0x000001fde959d530) Line 226    
C++
        rexx.exe!invoke_main() Line 65  C++
        rexx.exe!__scrt_common_main_seh() Line 253      C++
        rexx.exe!__scrt_common_main() Line 296  C++
        rexx.exe!mainCRTStartup() Line 17       C++
        kernel32.dll!BaseThreadInitThunk()     Unknown
        ntdll.dll!RtlUserThreadStart() Unknown

This is with a 64-bit debug version of the latest ooRexx (r12388).

Sometimes the creation is successful, sometimes it crashes.

---

Leaving the debugger open in case more information is necessary. (Will be off 
for a while though.)

---rony

_______________________________________________
Oorexx-devel mailing list
Oorexx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/oorexx-devel

Reply via email to