Гадания не гадания...оно то вылазиет то нет.Два идентичных класса,только один синглтон,второй нет.в синглтоне не на что не ругается.Вообщем в любом случаи,проблема практически решена.Если не сложно,то посмотри,может что не так изначально сделал
typedef void (_stdcall *CheckDM)();
typedef bool (_stdcall *Initialize) (WCHAR* );
typedef void (_stdcall *PostCommand) (WCHAR* );
typedef int (_stdcall *Command) (WCHAR* );
typedef int (_stdcall *CommandEx) (WCHAR* ,WCHAR* );
typedef bool (_stdcall *RunModule) (int* );
typedef bool (_stdcall *RunEvent) (int* );
typedef void (_stdcall *SetAsString) (int* ,WCHAR* );
typedef void (_stdcall *GetAsString) (int* ,WCHAR* );
typedef void (_stdcall *SetAsInteger) (int* ,int* );
typedef int (_stdcall *GetAsInteger) (int* );
typedef void (_stdcall *SetAsFloat) (int* ,double* );
typedef double (_stdcall *GetAsFloat) (int* );
typedef void (_stdcall *SetAsBoolean) (int* ,bool* );
typedef bool (_stdcall *GetAsBoolean) (int* );
typedef void (_stdcall *SetMatrix) (int* ,int* ,int* ,int* );
typedef double (_stdcall *GetMatrix) (int* ,int* ,int* );
typedef void (_stdcall *ItemName) (int* ,WCHAR* );
typedef int (_stdcall *ItemOwner) (int* );
class DMClient
{
private:
HINSTANCE hDMClientDll;
protected:
//Constructor:
DMClient():_refCount(0)
{hDMClientDll = ::LoadLibraryW(L"DMClient.dll");
++_refCount;}
//Destructor:
virtual ~DMClient(){FreeLibrary(hDMClientDll);}
//Static pointer:
static DMClient* _self;
int _refCount;
public:
//Singleton Constructor:
static DMClient* Instance()
{
if(!_self)
{
_self = new DMClient();
}
return _self;
}
//Counting pointer
void DeleteInstance()
{
if(--_refCount==0)
{
delete this;
_self = 0;
}
}
//Prototype methods:
void CheckDM_pl();
bool Initialize_fl (WCHAR* adress);
void PostCommand_pl (WCHAR* command);
int Command_fl (WCHAR* command);
int CommandEx_fl (WCHAR* command,WCHAR* aResBuff);
bool RunModule_fl (int* moduleID);
bool RunEvent_fl (int* eventID);
void SetAsString_pl (int* fieldID,WCHAR* value);
void GetAsString_pl (int* fieldID,WCHAR* buffer);
void SetAsInteger_pl (int* fieldID,int* value);
int GetAsInteger_fl (int* fieldID);
void SetAsFloat_pl (int* fieldID,double* value);
double GetAsFloat_fl (int* fieldID);
void SetAsBoolean_pl (int* fieldID,bool* value);
bool GetAsBoolean_fl (int* fieldID);
void SetMatrix_pl (int* fieldID,int* row,int* col,int* value);
double GetMatrix_pl (int* fieldID,int* row,int* col);
void ItemName_pl (int* itemID, WCHAR* buffer);
int ItemOwner_fl (int* itemID);
};
DMClient* DMClient::_self = 0;
ну и пример загрузки функции.
bool DMClient::Initialize_fl(WCHAR *adress)
{
Initialize initialize;
bool res;
if (hDMClientDll!=NULL){
initialize=(Initialize)GetProcAddress(hDMClientDll,"Initialize");
res = (*initialize)(adress);
}
return res;
}
Еще смущает,что в библиотеке,созданной на делфи,есть процедуры,и вызов их,вероятно я делаю не верный :
void DMClient::CheckDM_pl()
{
if (hDMClientDll!=NULL){
CheckDM checkDM;
checkDM=(CheckDM)GetProcAddress(hDMClientDll,"CheckDM");
(*checkDM)();
}
}