Нужно следующее:
1. У кого есть опыт использования STL в UDF-ках написанных на C++Builder'e поделитесь есть ли подводные камни при работе?
2. В UDF-ке создан класс (упрощенно):
Код: Выделить всё
#ifndef File1H
#define File1H
#include <vector>
#ifdef __DLL__
# define DLL_E __declspec(dllexport)
#endif
class MS
{
private:
vector<int> vInt;
public:
void FillVector(){for(int i = 0; i < 500; i++) vInt.push_back(i);};
int GetElement(int Pos){return vInt[Pos]};
}
typedef MS *PMS;
Код: Выделить всё
extern "C" PMS DLL_E __cdecl Create();
extern "C" int DLL_E __cdecl Free(PMS);
extern "C" int DLL_E __cdecl Fill(PMS);
extern "C" int DLL_E __cdecl GetElement(PMS,const int *);
PMS __cdecl Create()
{
return new MS();
}
int __cdecl Free(PMS DS)
{
delete DS;
return 0;
}
int __cdecl Fill(PMS DS)
{
return DS->FillVector();
}
int __cdecl GetElement(PMS DS,int Pos)
{
return DS->GetElement(Pos);
}
#endif
Код: Выделить всё
DECLARE EXTERNAL FUNCTION DSCREATE
RETURNS INTEGER BY VALUE
ENTRY_POINT 'Create' MODULE_NAME 'MSDLL';
DECLARE EXTERNAL FUNCTION DSFILL
INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT 'Fill' MODULE_NAME 'MSDLL';
DECLARE EXTERNAL FUNCTION DSGETELEMENT
INTEGER,
INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT 'GetElement' MODULE_NAME 'MSDLL';
DECLARE EXTERNAL FUNCTION DSFREE
INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT 'Free' MODULE_NAME 'MSDLL';
и затем при помощи данного указателя работать с объектом.
Однако, получается нечто неясное. Через указатель, возвращенный функцией Create() можно вызывать методы созданного объекта, но только не те, что модифицируют поля объекта. Т.е. если у объекта есть метод, например, что-то записывающий в лог-файл - все ок, метод срабатывает данные в лог пишутся. Но если пытаешься вызвать метод FillVector, который заполняет вектор данными - валится с Exception'ом...
Причем если добавить к вышеописанному классу конструктор и работать с вектором в конструкторе (например добавить в него что-то) - все ок. Но затем при работе с объектом через указатель из хранимой процедуры, получить данные из вектора (записанные в конструкторе) опять же нельзя.
Подскажите пожалуйста как правильно организовать работу с объектом класса, через указатель, полученный в хранимой процедуре посредством UDF.
Или, если я неправ в чем то изначально, направьте на путь истинный.
Заранее большое спасибо.