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();