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*


Anmelden zum Antworten