wrapperdatei mit variablen
-
Hallo !
Ich hab endlich erste Erfolge damit, eine c++ dll so zu wrappen, dass ich sie in c# aufrufen kann.
Leider habe ich dabei übersehen, dass bestimmte Variablen für praktisch alle Funktionen bekannt sein müssen. Gleichzeitig sind die dermaßen groß, dass ich sie nur ungern in c# nachbauen will. Es sollte für c# reichen zu wissen, dass dll-intern 2 Instanzen angelegt sind und ich als Funktionsparameter einen Int als Identifizierer zB cameranum = 1 oder 2 übergebe.Nur wie ? Normal (c++ zu c++) wäre, dass man ein Programm aufbaut indem die unmanaged Funktionen aufgerufen werden und auch alle Variablen deklariert sind.
Doch hier soll eine wrapper-dll geschrieben werden, die abschließend von c# aus aufgerufen wird, Funktion für Funktion. Wie kann man da Variablen in der zu wrappenden dll GLOBAL bekannt machen??? SO funktionierts schonmal nicht (die CAMDESC-Instanzen müssen bekannt sein. Stürzt ab bei int W_SR_API_StartCameraConnectionManagement(int cameranum)):
// SR_API_WRAP.h #define WRAP __declspec(dllexport) using namespace System; #include <string> #include "SR_API.h" #pragma comment(lib,"SR_API.lib") CAMDESC* cd1; CAMDESC* cd2; extern "C" { __declspec(dllexport) char* W_SR_API_GetAPIVersion(); __declspec(dllexport) int W_SR_API_Init(); __declspec(dllexport) int W_SR_API_Exit(); __declspec(dllexport) int W_SR_API_StartCameraConnectionManagement(int cameranum); __declspec(dllexport) int W_SR_API_StopCameraConnectionManagement (int cameranum); }#include "StdAfx.h" #include "SR_API_WRAP.h" #include <string> // Dies ist die Haupt-DLL. int __cdecl W_StatusMessage(STATUS_MSG_ARGLST) { int zeigedat; char one; std::string strtest; char* zeigemesg=" "; int strlength=0; //Was möchtest du machen? Ich vermute stark, diese Funktion ist ein Eventhandler, //und du kannst so auf Ereignisse reagieren ... zeigedat=msgType; zeigedat=msgdata1; zeigedat=msgdata2; if( msg!=NULL) { one = *msg; while (one != NULL) { strtest = strtest+one; msg++; strlength++; one = *msg; } msg=msg-strlength; } else strtest = "Nullpointer"; return 0; } extern "C" { __declspec(dllexport) char* W_SR_API_GetAPIVersion() { char* version; //string ver_str; version = SR_API_GetAPIVersion(); //ver_str = version; return version; } __declspec(dllexport) int W_SR_API_Init() { cd1 = new CAMDESC; cd2 = new CAMDESC; return SR_API_Init(W_StatusMessage); } __declspec(dllexport) int W_SR_API_Exit() { return SR_API_Exit(); } __declspec(dllexport) int W_SR_API_StartCameraConnectionManagement(int cameranum) { if( cameranum ==1 || cameranum==2) { if (cameranum == 1) return SR_API_StartCameraConnectionManagement(cd1); if (cameranum == 2) return SR_API_StartCameraConnectionManagement(cd2); } else { return 999; } } __declspec(dllexport) int W_SR_API_StopCameraConnectionManagement (int cameranum) { if( cameranum ==1 || cameranum==2) { if (cameranum == 1) return SR_API_StopCameraConnectionManagement (cd1); if (cameranum == 2) return SR_API_StopCameraConnectionManagement (cd2); } else { return 999; } } }KEINER DA?? *heul*