Проблема с высвобождением памяти в dll
От: anton20vlad  
Дата: 11.03.09 12:07
Оценка:
Нужно написать обёртку для апи предоставлемого одной конторой(потому как типы параметров экспортируемых апишной библиотекой функций имеют только сишный эквивалент). Это понадобилось для того чтобы использовать апи в Делфи.

Вот то что у меня в обёртке на экспорт:
DIVA_STATUS DLL_SPEC WDIVA_getRequestInfo(int RequestType, int reqNum)
{


DIVA_REQUEST_INFO requestInfo;

DIVA_STATUS cr = DIVA_getRequestInfo (
reqNum,
&requestInfo
);
return 1;
}

Теперь приведу условные обозначения:
1. #define DLL_SPEC __declspec(dllexport)
2. DIVA_STATUS = int
3. class DIVA_REQUEST_INFO { // Introduced in DIVA 5.3

public:

int requestNumber;
DIVA_REQUEST_TYPE requestType;
DIVA_REQUEST_STATE requestState;
int progress; // from 0 to 100 (%)
// may always be 0 if not significant or not available
DIVA_ABORTION_REASON abortionReason;
DIVA_OBJECT_SUMMARY objectSummary;
DIVA_REPACK_TAPES_INFO repackTapes;
int currentPriority; // From 0 to 100
DIVA_STRING additionalInfo;
// may be 0 is not significant or not available

} ;
4. typedef enum {
DIVA_ARCHIVE_REQUEST = 0,
DIVA_RESTORE_REQUEST,
DIVA_DELЕTЕ_REQUEST,
DIVA_EJECT_REQUEST,
DIVA_INSERT_REQUEST,
DIVA_COPY_REQUEST,
DIVA_RESTORE_INSTANCE_REQUEST,
DIVA_DELЕTЕ_INSTANCE_REQUEST,
DIVA_UNKNOWN_REQUEST_TYPE,
DIVA_AUTOMATIC_REPACK_REQUEST,
DIVA_ONDEMAND_REPACK_REQUEST,
DIVA_ASSOC_COPY_REQUEST,
DIVA_PARTIAL_RESTORE_REQUEST,
DIVA_MULTIPLE_RESTORE_REQUEST,
DIVA_TRANSCODE_ARCHIVED_REQUEST
} DIVA_REQUEST_TYPE ;

5.typedef enum {

DIVA_PENDING = 0,
DIVA_TRANSFERRING,
DIVA_MIGRATING,
DIVA_COMPLETED,
DIVA_ABORTED,
DIVA_CANCELLED,
DIVA_UNKNOWN_STATE,
DIVA_DELETING,
DIVA_WAITING_FOR_RESOURCES,
DIVA_WAITING_FOR_OPERATOR,
DIVA_ASSIGNING_POOL,
DIVA_PARTIALLY_ABORTED,
DIVA_RUNNING

} DIVA_REQUEST_STATE;

6. class DIVA_ABORTION_REASON {

public :

DIVA_ABORTION_CODE code;
DIVA_STRING description;

};

7.typedef enum {

DIVA_AR_NONE = 0,
DIVA_AR_DRIVE,
DIVA_AR_TAPE,
DIVA_AR_ACTOR,
DIVA_AR_DISK,
DIVA_AR_DISK_FULL,
DIVA_AR_SOURCE_DEST,
DIVA_AR_RESOURCES,
DIVA_AR_LIBRARY,
DIVA_AR_PARAMETERS,
DIVA_AR_UNKNOWN,
DIVA_AR_INTERNAL,
DIVA_AR_SOURCE_DEST2 //Error using Destination 2 (BACKUP) during Y-Restore

} DIVA_ABORTION_CODE;

8.typedef std::wstring DIVA_STRING;
9.class DIVA_OBJECT_SUMMARY {

public :

DIVA_STRING objectName ;
DIVA_STRING objectCategory ;

} ;

10.class DIVA_REPACK_TAPES_INFO {

public :

DIVA_STRING sourceTape ; // the tape being repacked
DIVA_STRING destinationTape ; // the new tape created from sourceTape

} ;



Вроде всё. Вобщем проблема возникает после использования функции WDIVA_getRequestInfo в основной программе на Делфи. Я так понимаю ошибка возникает при попытке высвободить память занятую под DIVA_REQUEST_INFO. Подскажите как это лечится?



После раздумий и общения на форумах надумал написать что-то вроде:
DIVA_STATUS DLL_SPEC WDIVA_getRequestInfo(int RequestType, int reqNum)
{
                
    
    DIVA_REQUEST_INFO requestInfo;
    
    DIVA_STATUS cr = DIVA_getRequestInfo (
                    reqNum,
                    &requestInfo
                    );

    requestInfo.additionalInfo.~basic_string();
    requestInfo.objectSummary.objectCategory~basic_string();
        requestInfo.objectSummary.objectName.~basic_string();
    requestInfo.repackTapes.destinationTape.~basic_string();
    requestInfo.repackTapes.sourceTape.~basic_string();
    requestInfo.abortionReason.description.~basic_string();
  return 1;
}

Только вот ошибка вылетает при попытки освободить память с помощью деструктора ~basic_string(); Что я делаю не так?

добавил раскраску, а форматировать авторский текст — махнул рукой. — Кодт
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.