# Lib in Dll umschreiben (erweiterte MFC-Dll)



## Davetum (9. Juli 2003)

Hallo Leute,

zuerst einmal bin ich neu in diesem Forum und auch im Programmieren nicht wirklich fortgeschritten. Nun soll ich eine statische Bibliothek in eine dynamische (dll) umwandeln habe auch ein Tutorial dazu gemacht habe aber trotzdem einige Probleme. Es werden in der Lib nämlich globale Variablen verwendet was soweit ich weiß in einer DLL nicht zulässig ist. Diese Variablen werden benötigt um sie mit einer Datenbank zu verknüpfen und später mit Werten zu belegen die aus der Datenbank ausgelesen werden. (Hier entsprechender Quellcode)

//////////////////////////////////////////////////////////////////////////
// CMaterialRecordset

IMPLEMENT_DYNAMIC(CMaterialRecordset, CRecordset)

CMaterialRecordset::CMaterialRecordset(CDatabase* pdb)
	: CRecordset(pdb)
{
	//{{AFX_FIELD_INIT(CMaterialRecordset)
	m_Materialname = _T("");
	m_Dichte = 0.0;
	m_Wandreibwert = 0.0;
	m_Wendelreibwert = 0.0;
	m_Korndurchmesser = 0.0;
	m_Materialinfo = _T("");
	m_nFields = 6;
	//}}AFX_FIELD_INIT
	m_nDefaultType = snapshot;
}


CString CMaterialRecordset::GetDefaultConnect()
{
	// BEGIN USER ADDED
	CString defConnect;
	defConnect.Format("ODBC; DSN=%s", DSN); 
	return defConnect;
	// END USER ADDED

}

CString CMaterialRecordset::GetDefaultSQL()
{
	return _T("[Material]");
}

void CMaterialRecordset:oFieldExchange(CFieldExchange* pFX)
{
        //Hier werden die Variablen mit der Datenbank verknüpft
	//{{AFX_FIELD_MAP(CMaterialRecordset)
	pFX->SetFieldType(CFieldExchange:utputColumn);
	RFX_Text(pFX, _T("[Materialname]"), m_Materialname);
	RFX_Double(pFX, _T("[Dichte]"), m_Dichte);
	RFX_Double(pFX, _T("[Wandreibwert]"), m_Wandreibwert);
	RFX_Double(pFX, _T("[Wendelreibwert]"), m_Wendelreibwert);
	RFX_Double(pFX, _T("[Korndurchmesser]"), m_Korndurchmesser);
	RFX_Text(pFX, _T("[Materialinfo]"), m_Materialinfo);
	//}}AFX_FIELD_MAP
}

//////////////////////////////////////////////////////////////////////////
// CMaterialRecordset diagnostics

#ifdef _DEBUG
void CMaterialRecordset::AssertValid() const
{
	CRecordset::AssertValid();
}

void CMaterialRecordset:ump(CDumpContext& dc) const
{
	CRecordset:ump(dc);
}
#endif //_DEBUG


so nun weiß ich nicht ob das mit den globalen Variablen zulässig bzw. wie man das entsprechend umschreiben kann mit lokalen Variablen, dass das trotzdem noch funktioniert.  Die dll lässt sich kompilieren so wie sie ist aber leider mit dem Prgramm nicht linken. Es kommen dann 42 Linker Fehler. alle LNK2001. Ich wäre euch echt sehr dankbar wenn ihr mir bei meinem Problem weiterhelfen könntet. Many thanks schon mal

DAVE


----------



## Vaethischist (9. Juli 2003)

Globale Variablen kannst Du auch in der DLL verwenden. Der LNK2001 taucht nicht nur 47 mal auf, der weist auch ungefähr so viele Gründe auf, warum er auftritt. Verschiedene Versionen der verwendeten Bibliotheken, etc. (die MSDN hat 'ne reichlich lange Übersicht zu bieten)


----------



## Davetum (9. Juli 2003)

*Globale Variable in Dll günstig*

Nochmal eine Frage, kann es dann nicht zu Problemen kommen wenn mehere Anwendungen gleichzeitig auf die Dll zugreifen. In meinem Tutorial steht halt man sollte glob. Var in einer Dll vermeiden bzw. dass Sie gar nicht drin sein dürfen...

Vielen Dank auf jeden Fall für deine Antwort

MFG

DAVE


----------



## Kachelator (29. Juli 2003)

Jeder Prozess müsste eigentlich seine eigene Instanz einer globalen Variablen bekommen; das sollte kein Problem sein.

Nicht ganz dasselbe, aber informativ (aus der MSDN, Thema "How do I share data in my DLL with an application or with other DLLs?"):
"Static data members are implemented as the equivalent of global variables. This means that each process would have its own copy of that class's static data members. Classes with static data members should not be shared."


----------

