ciao.
ho la seguente definizione di un .h
in questo modo devo poter accedere alle variabili statiche dall esterno della classe.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); }
Il problema è che:
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.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 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();

Rispondi quotando