__finally
От: parsek  
Дата: 27.03.03 08:32
Оценка:
Приветствую!

Не пойму, почему не работает блок __finally



BOOL whatever() 
{
  BOOL bSuccess = FALSE;
  DWORD cbSid = 128;
  __try 
    {
         // initial memory allocations
         if( ( LPBYTE ptr = HeapAlloc( GetProcessHeap(),0, cbSid)) == NULL ) 
            __leave;
             
             //  Some processing

             bSuccess = TRUE;
        }
  __finally
        {  
             // Cleanup and indicate failure, if appropriate.
         HeapFree( GetProcessHeap(), 0, ptr );
        }
    return bSuccess;
}


то есть __try выполняется, bSuccess TRUE, а в __finally не входим.
Re: __finally
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 27.03.03 08:37
Оценка:
Здравствуйте, parsek, Вы писали:

[]

А как это вообще компИлится?
Re[2]: __finally
От: parsek  
Дата: 27.03.03 08:53
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>[]


AS>А как это вообще компИлится?


Прошу прощения за предыдущий код. Должно быть

#include <windows.h>

BOOL whatever() 
{
  BOOL bSuccess = FALSE;
  DWORD cbSid = 128;
  LPBYTE ptr;
  __try 
    {
         // initial memory allocations
         if( ( ptr = (LPBYTE)HeapAlloc( GetProcessHeap(),0, cbSid)) == NULL ) 
            __leave;
             
             //  Some processing

             bSuccess = TRUE;
        }
  __finally
        {  
             // Cleanup and indicate failure, if appropriate.
         HeapFree( GetProcessHeap(), 0, ptr );
        }
    return bSuccess;
}

int main(int argc, char* argv)
{
    whatever();
    return 0;
}
Re: __finally
От: 0x64Rm  
Дата: 27.03.03 09:26
Оценка:
Здравствуйте, parsek, Вы писали:

P>Приветствую!


P>Не пойму, почему не работает блок __finally


Привет!

Все у тебя работает. Ты наверное брекпоинт внутрь __finally ставишь а дебагер пролетает мимо? так?
Вот попробуй поменять. а брек поинт ставь на выходе из функции.

  __finally
     {  
         // Cleanup and indicate failure, if appropriate.
         res = HeapFree( GetProcessHeap(), 0, ptr ); 
         if(res) ptr = 0;
     }


если не так то расскажи поподробнее

Внесены изменения автора. -- ПК.
с уважением,
Алексей
Re[2]: __finally
От: parsek  
Дата: 27.03.03 10:36
Оценка:
Здравствуйте, 0x64Rm, Вы писали:

P>>Не пойму, почему не работает блок __finally


R>Все у тебя работает. Ты наверное брекпоинт внутрь __finally ставишь а дебагер пролетает мимо? так?

R>Вот попробуй поменять. а брек поинт ставь на выходе из функции.

R>
R>  __finally
R>     {  
R>         // Cleanup and indicate failure, if appropriate.
R>         res = HeapFree( GetProcessHeap(), 0, ptr ); 
R>         if(res) ptr = 0;
R>     }
R>


R>если не так то расскажи поподробнее


Проблема была не в этом коде, я все упростил, хотя этот пример у меня тоже не выполняет чистку. И после исправлений.
Может, Visual Studio глючит..
У Вас этот пример выполняет __finally?
Re[3]: __finally
От: 0x64Rm  
Дата: 27.03.03 11:14
Оценка:
Здравствуйте, parsek, Вы писали:

P>Проблема была не в этом коде, я все упростил, хотя этот пример у меня тоже не выполняет чистку. И после исправлений.

P>Может, Visual Studio глючит..
P>У Вас этот пример выполняет __finally?

Возможно Visual Studio глючит. У меня на VC6 все ок. а попробуй посмотреть что GetLastError выдает ->

 __finally
        {  
                 res = HeapFree( GetProcessHeap(), 0, ptr );
         res = GetLastError();
        }


да, кстати после успешного HeapFree ptr не меняет значения. Можно его самому в нулл обращать
с уважением,
Алексей
Re[4]: __finally
От: parsek  
Дата: 27.03.03 12:10
Оценка:
Здравствуйте, 0x64Rm, Вы писали:

P>>Проблема была не в этом коде, я все упростил, хотя этот пример у меня тоже не выполняет чистку. И после исправлений.

P>>Может, Visual Studio глючит..
P>>У Вас этот пример выполняет __finally?

R>Возможно Visual Studio глючит. У меня на VC6 все ок. а попробуй посмотреть что GetLastError выдает ->


R>
R> __finally
R>        {  
R>                 res = HeapFree( GetProcessHeap(), 0, ptr );
R>         res = GetLastError();
R>        }
R>

R>
R>да, кстати после успешного HeapFree ptr не меняет значения. Можно его самому в нулл обращать

он же не выполняет HeapFree. Речь идет о том, что блок __finally вообще не исполняется.
Re[5]: __finally
От: 0x64Rm  
Дата: 27.03.03 13:30
Оценка:
Здравствуйте, parsek, Вы писали:

P>он же не выполняет HeapFree. Речь идет о том, что блок __finally вообще не исполняется.


Привет еще раз. Очень интересно! Извини что я так настойчив но здоровое любопытсво не отпускает
Будь другом попробуй вот это еще (последнее и если не пройдет я склонен считать, что это глюк С)

  __finally
        {  
            HeapFree( GetProcessHeap(), 0, ptr );
            MessageBox(NULL,"Hello form __finally!","",MB_OK);
        }


видишь мессаджбокс?

или вот весь пример у меня, который работает

#include "stdafx.h"
#include <windows.h>


BOOL whatever() 
{
  BOOL bSuccess = FALSE;
  DWORD cbSid = 128;
  LPBYTE ptr = 0;
  DWORD res = 0;

  __try 
    {
         // initial memory allocations
         if( ( ptr = (LPBYTE)HeapAlloc( GetProcessHeap(),0, cbSid)) == NULL ) 
            __leave;
             
             //  Some processing

             bSuccess = TRUE;
        }
  __finally
        {  
            HeapFree( GetProcessHeap(), 0, ptr );
            MessageBox(NULL,"Hello form __finally!","",MB_OK);
        }
    return bSuccess;
}

int main(int argc, char* argv)
{
    whatever();
    return 0;
}


всего доброго
с уважением,
Алексей
Re[6]: __finally
От: parsek  
Дата: 28.03.03 08:19
Оценка:
Здравствуйте, 0x64Rm, Вы писали:

P>>он же не выполняет HeapFree. Речь идет о том, что блок __finally вообще не исполняется.


R>Привет еще раз. Очень интересно! Извини что я так настойчив но здоровое любопытсво не отпускает

R>Будь другом попробуй вот это еще (последнее и если не пройдет я склонен считать, что это глюк С)

R>
R>  __finally
R>        {  
R>            HeapFree( GetProcessHeap(), 0, ptr );
R>            MessageBox(NULL,"Hello form __finally!","",MB_OK);
R>        }
R>


R>видишь мессаджбокс?


[skip]

Этот пример работает. А вот изначальный код, где у меня не выполняется __finally:


BOOL GetAccountSid(LPCTSTR SystemName, LPCTSTR AccountName, PSID *Sid )
{
    LPTSTR RefDomain = NULL;
    DWORD cbSid = 128;            // initial allocation attempt
    DWORD cbRefDomain = 16;        // initial allocation size
    SID_NAME_USE peUse;
    BOOL bSuccess = FALSE;        // assume this function will fail
    
    __try 
    {
        // initial memory allocations
        //
        if( ( *Sid = HeapAlloc( GetProcessHeap(),
            0,
            cbSid
            )) == NULL ) 
            __leave;
        
        if( ( RefDomain = (LPTSTR)HeapAlloc( GetProcessHeap(),
            0,
            cbRefDomain    )) == NULL ) 
            __leave;
        
        // Obtain the SID of the specified account on the specified system.
        //
        while( !LookupAccountName(
            SystemName,         // machine to lookup account on
            AccountName,        // account to lookup
            *Sid,               // SID of interest
            &cbSid,             // size of SID
            RefDomain,            // domain account was found on
            &cbRefDomain,
            &peUse )) 
        {
            if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER ) 
            {
                // reallocate memory
                //
                if( (*Sid = HeapReAlloc( GetProcessHeap(),
                    0,
                    *Sid,
                    cbSid )) == NULL) 
                    __leave;
                
                if( (RefDomain = (LPTSTR)HeapReAlloc( GetProcessHeap(),
                    0,
                    RefDomain,
                    cbRefDomain )) == NULL) 
                    __leave;
            }
            else 
                __leave;
        }
        
        // Indicate success.
        //
        bSuccess = TRUE;
        
    } 
    __finally  
    {
        // Cleanup and indicate failure, if appropriate.
        HeapFree( GetProcessHeap(), 0, RefDomain );
        
        if(!bSuccess) 
        {
            if(*Sid != NULL) 
            {
                HeapFree( GetProcessHeap(), 0, *Sid);
                *Sid = NULL;
            }
        }
        
    } // finally
    
    return bSuccess;
}


выполняю по шагам, доходит до __finally и перескакивает на return.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.