Hi,
ich hoffe ihr könnt mir weiterhelfen, google hat mich im Stich gelassen, oder ich suche einfach nach dem falschen
Ich hab eine alte .dll die in C geschrieben wurde. Diese würde ich gerne in einem C# Projekt weiterverwenden, klappt soweit auch ganz gut, so lange ich „nur“ Funktionen aufrufe, die nicht schreibend auf den Speicher zugreifen.
Meine Probleme haben angefangen mit einer Funktion, zum Initialisieren der dll. Dabei wird unter anderem eine Liste von Funktionspointern an die .dll auf der C Seite übergeben udn diese Liste wird in einer Struktur gespeichert.
Sieht ungefähr so aus:
C#-Seite:
// Definieren des Funktionspointers als Delegate
[UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]
public delegate void setFirstDataDelegate(string s);
// Erzeugen der Struktur auf der C# Seite
[Serializable]
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class FunctionJumpTable
{
setFirstDataDelegate setFirstData;
[…]
}
// Importieren der Intitialisierungsfunktion aus der dll
[DllImport(„ctocs.dll“)]
public extern static void initDataStructure(FunctionJumpTable jumpTable);
// Erzeugen einer neuen Sprungtabelle
FunctionJumpTable jumpTable = new FunctionJumpTable();
// Initialisieren der Werte
jumpTable.setFirstData = new DataStructure.initDelegate(dataStructure.initDataStructure);
[…]
// Aufrufen der Initialisierungsfunktion
ctocs.initDataStructure(jumpTable);
C-Seite
// Definieren des Funktionspointers
typedef void (__cdecl *SETFIRSTDATA)( char*);
// Erzeugen der Struktur auf der C Seite
typedef struct
{
SETFIRSTDATA setFirstData;
[…]
} JUMPTABLE;
definieren einer globalen Variable
JUMPTABLE m_jumpTable;
// Definition der Funktion die die globale Variable schreiben soll
_declspec(dllexport) void init( JUMPTABLE fp_jumpTable)
{
// Speichern der Tabelle in die Globale Variable
// und an dieser Stelle bekomme ich eine AccessViolation
m_jumpTable = fp_jumpTable
}
Ich habe mir dann gedacht, dass ihm die Struktur (dieses Beispiel habe ich abgeschrieben) nicht passt und es mit einem einzelnen Funktionspointer versucht.
Nachdem das auch nicht gegangen ist, habe ich es mit einem einfachen Integer versucht und siehe da, gleicher Fehler…
Ich denke ich muss irgendwo sagen, das es sich um unmanaged Code handelt und die cdll in den Speicher schreiben darf. Aber wo???
Wenn ich eine Funktion mit aufrufe
ctocs.test(setFirstDataDelegateObject);
und dann die Funktion test
void test (SETFIRSTDATA function)
{
function(„hallo“);
}
aufrufe Funktioniertes, aber eben nicht, wenn ich den Funktionspointer zwischenspeichern möchte
Ich hoffe das war halbwegs verständlich und es wäre superklasse wenn mir irgendjemand weiterhelfen kann
Weil da sind noch mehr Funktionen in der dll, die Globale Variablen verändern…
Danke schon mal
/silvl