DLL erstellen: dll zur Kommunikation zwischen zwei Simulationstools.



  • Hallo Leute, 😡
    ich soll ein Tool mittels DDE und DLL von meiner Anwendung aus steuern (starten, stop, Daten lesen...), dafür brauche ich eine DLL, aber hab null Ahnung!!. ich hab ein dll-project geöffnet, dies sieht so aus, aber es läuft nicht, kann mir jemand bitte helfen. Bei Kompilierung treten Fehler auf:
    IsEMPlant.h:

    #ifndef _IS_EMPLANT_H_ 
    #define _IS_EMPLANT_H_ 
    
    #if BUILDING_DLL 
    #define DLLIMPORT __declspec (dllexport) 
    #else 
    # define DLLIMPORT __declspec (dllimport) 
    #endif /* Not BUILDING_DLL **********/ 
    
    #if _MSC_VER > 1000 
    # pragma once 
    #endif 
    #include "Ressource.h" 
    class CIsEMPlantApp : public CWinApp 
    { 
    public: 
    CIsEMPlantApp(); 
    //{{ 
    //}} 
    DECLARE_MESSAGE_MAP() 
    }; 
    #include "IssopSimulators.h" 
    //weitere Befehle */ 
    #endif
    

    IsEMPlant.c: sieht folgendermaßen:

    #include "IsEMPlant.h" 
    #include "StdAfx.h" 
    
    #ifndef _DEBUG 
    #define new DEBUG_NEW 
    #undef THIS_FILE 
    static char THIS_FILE[] = __FILE__; 
    #endif 
    // 
    BEGIN_MESSAGE_MAP(CIsEMPlantApp, CWinApp) 
    END_MESSAGE_MAP() 
    // 
    CIsEMPlantApp:IsEMPlantApp (void) 
    { 
    } 
    // 
    CIsEMPlantApp theApp; 
    char sfnDirExt [_MAX_FNAME] = { '\0' }; 
    char sfnStateExt [_MAX_FNAME] = { '\0' }; 
    char sfnControlExt [_MAX_FNAME] = { '\0' }; 
    char sfnToExt [_MAX_FNAME] = { '\0' }; 
    char sfnFromExt [_MAX_FNAME] = { '\0' }; 
    char sComSpec [_MAX_FNAME]; 
    // 
    bool bExe = true; 
    
    void WriteSteuer (int nValue); 
    { 
    FILE *fpCtr = fopen (sfnControlExt, "w"); 
    if (fpCtr != NULL) 
    { 
    fprintf (fpCtr, "%d\n", nValue); 
    fclose (fpCtr); 
    } 
    } 
    bool Write_external (PIS_PARAM pX, PIS_PARAM pZ); 
    { 
    FILE *fp = fopen (sfnToExt, "w"); 
    if (fp == NULL) return false; 
    for (int nIndex = 0; nIndex < pX->nSize; ++nIndex) 
    fprintf(fp, "%lf\n", pX->pdValue[nIndex]); 
    fclose (fp); 
    
    fp = fopen (sfnStateExt, "w"); 
    if (fp == NULL) return false; 
    // 
    for (int nIndex = 0; nIndex < pZ->nSize; ++nIndex) 
    fprintf(fp, "%lf\n", pZ->pdValue[nIndex]); 
    fclose (fp); 
    return true; 
    } 
    bool Read_external (PIS_PARAM pY, int nSize); 
    { 
    FILE *fp = fopen (sfnFromExt, "w"); 
    if (fp == NULL) return false; 
    for (int nIndex = 0; nIndex < nSize; ++nIndex) 
    if (1 != fscanf (fp, "%lf", pY->pdValue + nIndex)) 
    { 
    fclose (fp); 
    return false; 
    } 
    fclose (fp); 
    return true; 
    } 
    /////////////////// 
    static LPCSTR SimulatorNames[] = {"Programs"}; 
    const int SimNumbers = sizeof SimulatorNames / sizeof LPCSTR; 
    // 
    extern "C" void WINAPI IsGetVersion (int &nMajor, int &nMinor) 
    { 
    nMajor = 1; 
    nMinor = 0; 
    } 
    extern "C" int WINAPI IsGetNumberSimulators (void) 
    { 
    return SimNumbers; 
    } 
    extern "C" LPCSTR WINAPI IsGetSimulatorName (const int nIndex) 
    { 
    return nIndex < 0 || nIndex >= SimNumbers ? NULL : SimulatorNames[nIndex]; 
    } 
    extern "C" bool WINAPI IsInitSimulator (const int nIndex) 
    { 
    if (nIndex < 0 || nIndex >= SimNumbers) return false; 
    return true; 
    } 
    extern "C" void WINAPI IsDoneSimulator (void) 
    { 
    } 
    extern "C" bool WINAPI IsPrepare (LPCSTR szModelPath, int nControl) 
    { 
    char drive[_MAX_DRIVE]; 
    char dir[_MAX_DIR]; 
    char ext[_MAX_EXT]; 
    _splitpath (szModelPath, drive, dir, NULL, ext); 
    _makepath (sfnDirExt, drive, dir, NULL, NULL); 
    if (0 == _stricmp (".exe", ext)) bExe = true; else 
    if (0 == _stricmp (".bat", ext)) bExe = false; else 
    { 
    #ifdef German 
    AfxMessageBox( 
    "Zur Zeit unterstützt ISSOP nur Dateitypen mit EXE und BAT."; 
    #endif 
    return false; 
    } 
    strcpy (sfnToExt, sfnDirExt); strcat (sfnDirExt, "Einlese.txt"); 
    strcpy (sfnFromExt, sfnDirExt); strcat (sfnFromExt, "Ausgabe.txt"); 
    strcpy (sfnStateExt, sfnDirExt); strcat (sfnStateExt, "Zustand.txt"); 
    strcpy (sfnControlExt, sfnDirExt); strcat (sfnControlExt, "Steuer.txt"); 
    WriteSteuer (nControl); 
    
    return true; 
    } 
    extern "C" bool WINAPI IsSimulate (LPCSTR pszModelPath, int nReps, PIS_PARAM pX, PIS_PARAM pZ, PIS_PARAM pY) 
    { 
    char buffer[256]; 
    if (bExe) 
    strcpy (buffer, pszModelPath); 
    else 
    sprintf (buffer, "%s /C %s", sComSpec, pszModelPath); 
    //startup Information structure 
    PROCESS_INFORMATION pin; 
    SARTUPINFO sin; 
    memset (&sin, 0, sizeof (SARTUPINFO)); 
    sin.cb = sizeof (SARTUPINFO); 
    sin.dwFlags = SARTF_UERSHOWWINDOW; 
    sin.wShowWindow = SW_SHOW; 
    char current_path_buffer[_MAX_PATH], 
    if (GetCurrentDirectory (_MAX_PATH, current_path_buffer) 
    { 
    if (!SetCurrentDirectory(sfnDirExt)) 
    SetCurrentDirectory(current_path_buffer); 
    } 
    else 
    *current_path_buffer = '\0'; 
    VERIFY (Write_external (pX, pZ)); 
    if (!CreateProcess (NULL, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &sin, &pin)) 
    return false; 
    if (*current_path_buffer) SetCurrentDirectory(current_path_buffer); 
    DWORD dwWait = WaitForSingleObject (pin.hProcess, 30000); 
    if (dwWait == WAIT_TIMEOUT) 
    TerminateProcess (pin.hProcess, 0); 
    //Close 
    CloseHandle (pin.hProcess); 
    CloseHandle (pin.hThread); 
    //erfolgreich? 
    if (dwWait != WAIT_OBJECT_0) 
    return false; 
    //Ergebnisse lesen 
    VERIFY (Read_external (pY, 1 + pY->nSize * max (1, nReps))); 
    return true; 
    } 
    /**** initialize Simulator for Simulation. 
    pszModelPath - Modellpfad 
    nReps - number of replications *********/ 
    extern "C" bool WINAPI IsInitSes (LPCSTR pszModelPath, int nReps) 
    { 
    char *sComSpecT = getenv ("COMSPEC"); 
    if (!sComSpecT || sizeof (sComSpec) =< strlen (sComSpecT)) 
    return false; 
    strcpy (sComSpec, sComSpecT); 
    return true; 
    } 
    /**** initialize Simulator after Simulation. 
    nReps - number of replications *********/ 
    extern "C" void WINAPI IsDoneSes (int nReps) 
    { 
    } 
    extern "C" void WINAPI IsGetModelFileProps (LPCSTR &pszFilter, LPCSTR &pszDefExt) 
    { 
    #ifdef German 
    pszFilter = "Programs (*.bat;*.exe\0*.bat;*.exe\0Alle Dateien (*.*)\0*.*\0"; 
    #endif 
    pszDefExt = "EXE"; 
    } 
    extern "C" LPCSTR WINAPI IsGetSymbol (LPCSTR pszModelPath, LPCSTR pszSymbol) 
    { 
    return NULL; 
    }
    

    IssopSimulators.h :

    #ifndef __ISSOP_SIMULATORS_H_ 
    #define __ISSOP_SIMULATORS_H_ 
    struct IS_PARAM 
    { 
    int nSize; 
    LPCSTR *ppszName; 
    double *pdValue; 
    }; 
    typedef IS_PARAM *PIS_PARAM; 
    EXPORTS 
    IsGetVersion @1 
    IsGetNumberSimulators @2 
    IsGetSimulatorName @3 
    IsInitSimulator @4 
    IsDoneSimulator @5 
    IsPrepare @6 
    IsSimulate @7 
    IsInitSes @8 
    IsDoneSes @9 
    IsGetModelFileProps @10 
    IsGetSymbol @11 
    
    extern "C" void WINAPI IsGetVersion (int &nMajor, int &nMinor); 
    extern "C" int WINAPI IsGetNumberSimulators (void); 
    extern "C" LPCSTR WINAPI IsGetSimulatorName (const int nIndex); 
    extern "C" bool WINAPI IsInitSimulator (const int nIndex); 
    extern "C" void WINAPI IsDoneSimulator (void); 
    extern "C" bool WINAPI IsPrepare (LPCSTR szModelPath, int nControl); 
    extern "C" bool WINAPI IsSimulate (LPCSTR pszModelPath, int nReps, PIS_PARAM pX, PIS_PARAM pZ, PIS_PARAM pY); 
    extern "C" bool WINAPI IsInitSes (LPCSTR pszModelPath, int nReps); 
    extern "C" void WINAPI IsDoneSes (int nReps); 
    extern "C" void WINAPI IsGetModelFileProps (LPCSTR &pszFilter, LPCSTR &pszDefExt); 
    extern "C" LPCSTR WINAPI IsGetSymbol (LPCSTR pszModelPath, LPCSTR pszSymbol); 
    #endif
    

    Ich bitte Euch um Unterstützung. Bitte Kompilieren und mir Korrekturvorschläge geben.
    😃



  • Was sind wir denn hier? Wieviel zahlst du? Umsonst wird das niemand machen, so wie du das aufbereitet hast ...



  • Hi,
    Ok, werde gern bezahlen - wieviel verlangt Ihr (Bitte Studententarif 😉 ).

    Gruß



  • Darum geht es dich garnicht. dEUs meinte das du mal vielleicht Fehler postest und uns nicht zum Bug-fixern abstempelst.

    Ich helfe gerne habe aber auch nicht die Zeit jetzt deinen Code hier rauszukopieren, einProjekt damit anzulegen und dann zu schauen wo es hackt.
    Das sind deine Aufgaben. BZw. kannst du das Projekt ja zum Download anbieten wenn es überhaupt nicht anderes geht.



  • Also,
    ich habe das Projekt (.dll) in Dev-C++ compiliert, dabei treten die ersten folgenden Fehlermeldungen:

    15 E:\Diplomarbeit\ISSOP\DLLs\IsEMPlant.h -- #error include 'stdafx.h' before including this file for PCH

    18 E:\Diplomarbeit\ISSOP\DLLs\IsEMPlant.h -- Ressource.h: No such file or directory.

    vielen Dank



  • Sagt doch schon die Fehlermeldung.
    Wir können da auch nicht mehr sagen als die auf Deutsch für Dich zu übersetzen.
    Da gibt es auch nicht mehr zu sagen.
    Ist allerdings fraglich ob Devc++ eine Ressource.h erstellt. Kenn ich nur von Vc++ .
    Wenn du diesen nicht verwendest dann verwendest du auch keine MFC und dann gehört das in WinAPI oder in andere Compiler


Anmelden zum Antworten