ciao.
ho la seguente definizione di un .h
codice:
#pragma once
class CEntityDS;
class CImportDS
{
public:
CImportDS(){};
~CImportDS(){};
static CEntityDS* (*m_pFn)();
static int test;
virtual void * Pippo() {return m_pFn;};
};
class CImportBeamDSChess : public CImportDS
{
public:
CImportBeamDSChess();
~CImportBeamDSChess();
static CEntityDS* (*m_pFn)();
virtual void * Pippo();
};
class CImportConnectType : public CImportDS
{
public:
CImportConnectType();
~CImportConnectType();
static CEntityDS* (*m_pFn)();
virtual void * Pippo();
};
extern "C" {
__declspec(dllexport) void* GetPippo(CImportDS* pImpDs);
}
in questo modo devo poter accedere alle variabili statiche dall esterno della classe.
Il problema è che:
codice:
#include "stdafx.h"
#include "ImportDS.h"
int CImportDS::test = 0;
CEntityDS* (*CImportDS::m_pFn)();
//CBeamDSChess
CEntityDS* (*CImportBeamDSChess::m_pFn)();
//CConnectType
CEntityDS* (*CImportConnectType::m_pFn)();
CImportBeamDSChess::CImportBeamDSChess()
{
}
CImportBeamDSChess::~CImportBeamDSChess()
{
}
void * CImportBeamDSChess::Pippo()
{
return CImportBeamDSChess::m_pFn;
}
CImportConnectType::CImportConnectType()
{
}
CImportConnectType::~CImportConnectType()
{
}
void * CImportConnectType::Pippo()
{
return CImportConnectType::m_pFn;
}
extern "C" {
__declspec(dllexport) void* GetPippo(CImportDS* pImpDs) {
return pImpDs->Pippo();
}
}
Il tipo che puo essere CimportConnectType o CImportBeamDSChess viene creato a runtime e non so di cosa sarà, per questo ho provato a passare CimportDS(il tipo base dei due tipi, nella funzione che crea passo il tipo relativo) e utilizzarlo col polimorfismo per andare a leggere il puntatore a funzione corretto.
Il problema è che è sempre a 0 !
anche dopo che lo setto con :
codice:
void CModelImportFEM::ImportEntityDS(CCmpImportApi *pApi)
{
CImportBeamDSChess::m_pFn = &CreateDS<CBeamDSChess>;
CImportConnectType::m_pFn = &CreateDS<CBeamDSConnType>;
//for(pApi->DSReset(); pApi->NextDS();)
//{
int nEntityID = -1, nEntityType = CImportBeamDSChess::test = 10;
//funzione che crea il tipo opportuno da una lettura file e ritorna il creator nella forma base per renderlo generico , in futuro potro avere molte classi creator
CImportDS* pImpDS = pApi->ImportEntityDS(&nEntityID, &nEntityType);
//a questo punto faccio:
HMODULE mod=GetModuleHandle("C:\\factory\\CT\\Debug\\C.exe");
pFunc = (void *(__cdecl *)(CImportDS*)) GetProcAddress(mod, "GetPippo");//(CEntityDS *(__cdecl *)(void)) pImpDS->Pippo();
CImportDS* pIDs = (CImportDS*)pFunc(pImpDS);
//chiamo la funzione , pIDs->m_pFn che dovrebbe ritornarmi uno degli indirizzi che ho impostato qui:
CImportBeamDSChess::m_pFn = &CreateDS<CBeamDSChess>;
CImportConnectType::m_pFn = &CreateDS<CBeamDSConnType>;
CEntityDS* pds = pIDs->m_pFn();