Гадания не гадания...оно то вылазиет то нет.Два идентичных класса,только один синглтон,второй нет.в синглтоне не на что не ругается.Вообщем в любом случаи,проблема практически решена.Если не сложно,то посмотри,может что не так изначально сделал
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)();
    }
}