Ich wollte eine DLL schreiben die die eingehenden Messwerte in eine Datenbank schreibt.
Hier das ganze einmal mit SQLite.
Code: Alles auswählen
#include "dll.h"
#include <iostream>
#include <C:\Dokumente und Einstellungen\barbers\Desktop\sqlite-source\sqlite3.h>
#include <ctime>
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <stddef.h>
//Anzahl der Eingaenge
const unsigned char inputs = 17; //17-Eingaenge
//Anzahl der Ausgaenge
const unsigned char outputs = 0; //0-Ausgaenge
//Eingang 0 = M01, Eingang 1 = M02 usw.
const unsigned char M01 = 0;
const unsigned char M02 = 1;
const unsigned char M03 = 2;
const unsigned char M04 = 3;
const unsigned char M05 = 4;
const unsigned char M06 = 5;
const unsigned char M07 = 6;
const unsigned char M08 = 7;
const unsigned char M09 = 8;
const unsigned char M10 = 9;
const unsigned char M11 = 10;
const unsigned char M12 = 11;
const unsigned char M13 = 12;
const unsigned char M14 = 13;
const unsigned char M15 = 14;
const unsigned char M16 = 15;
const unsigned char EXE = 16;
//Bezeichnung für User-variabelen
const unsigned char CLK_OLD = 0;
const unsigned char RST_OLD = 1;
const unsigned char COUNT = 2;
//
//Aufruf von PROFILAB, liest Anzahl der Eingänge
DLLEXPORT unsigned char _stdcall NumInputs()
{
return inputs;
}
//Aufruf von PROFILAB, liest Anzahl der Ausgaenge
DLLEXPORT unsigned char _stdcall NumOutputs()
{
return outputs;
}
//Aufruf von PROFILAB, liest die Namen der Eingänge
DLLEXPORT void _stdcall GetInputName(unsigned char Channel,unsigned char *Name)
{
switch(Channel)
{
case 0://Bezeichnung Eingang-0
{
Name[0]= 'M';
Name[1]= '0';
Name[2]= '1';
Name[3]=0;
break;
}
case 1://Bezeichnung Eingang-1
{
Name[0]= 'M';
Name[1]= '0';
Name[2]= '2';
Name[3]= 0;
break;
}
case 2://Bezeichnung Eingang-0
{
Name[0]= 'M';
Name[1]= '0';
Name[2]= '3';
Name[3]=0;
break;
}
case 3://Bezeichnung Eingang-0
{
Name[0]= 'M';
Name[1]= '0';
Name[2]= '4';
Name[3]=0;
break;
}
case 4://Bezeichnung Eingang-0
{
Name[0]= 'M';
Name[1]= '0';
Name[2]= '5';
Name[3]=0;
break;
}
case 5://Bezeichnung Eingang-0
{
Name[0]= 'M';
Name[1]= '0';
Name[2]= '6';
Name[3]=0;
break;
}
case 6://Bezeichnung Eingang-0
{
Name[0]= 'M';
Name[1]= '0';
Name[2]= '7';
Name[3]=0;
break;
}
case 7://Bezeichnung Eingang-0
{
Name[0]= 'M';
Name[1]= '0';
Name[2]= '8';
Name[3]=0;
break;
}
case 8://Bezeichnung Eingang-0
{
Name[0]= 'M';
Name[1]= '0';
Name[2]= '9';
Name[3]=0;
break;
}
case 9://Bezeichnung Eingang-0
{
Name[0]= 'M';
Name[1]= '1';
Name[2]= '0';
Name[3]=0;
break;
}
case 10://Bezeichnung Eingang-0
{
Name[0]= 'M';
Name[1]= '1';
Name[2]= '1';
Name[3]=0;
break;
}
case 11://Bezeichnung Eingang-0
{
Name[0]= 'M';
Name[1]= '1';
Name[2]= '2';
Name[3]=0;
break;
}
case 12://Bezeichnung Eingang-0
{
Name[0]= 'M';
Name[1]= '1';
Name[2]= '3';
Name[3]=0;
break;
}
case 13://Bezeichnung Eingang-0
{
Name[0]= 'M';
Name[1]= '1';
Name[2]= '4';
Name[3]=0;
break;
}
case 14://Bezeichnung Eingang-0
{
Name[0]= 'M';
Name[1]= '1';
Name[2]= '5';
Name[3]=0;
break;
}
case 15://Bezeichnung Eingang-0
{
Name[0]= 'M';
Name[1]= '1';
Name[2]= '6';
Name[3]=0;
break;
}
case 16://Bezeichnung Eingang-0
{
Name[0]= 'E';
Name[1]= 'X';
Name[2]= 'E';
Name[3]=0;
break;
}
default:;
}
}
//Aufruf von PROFILAB, liest die Namen der Eingänge
DLLEXPORT void _stdcall GetOutputName(unsigned char Channel,unsigned char *Name)
{
switch(Channel)
{
default:;
}
}
//Aufruf von PROFILAB, setzt bei Programmstart den "Counter"auf "0"+ setzt alle Ausgaenge zurueck
DLLEXPORT void _stdcall CSimStart(double *PInput, double *POutput, double *PUser)
{
int i;
PUser[COUNT] = 0; //"Counter" ruecksetzen
for (i = 0; i < outputs; i++) //Alle Ausgaenge ruecksetzen
POutput[i] = 0;
}
//Aufruf von PROFILAB,hier steht die eigentliche Funktion der DLL
//
DLLEXPORT void _stdcall CCalculate(double *PInput, double *POutput, double *PUser)
{
int i, iCount;
char messwerte[400];
if (PInput[EXE] != 0) // EXE Eingang high?
{
sqlite3* datenbank;
if(sqlite3_open("C:\Dokumente und Einstellungen\barbers\Desktop\dll_dev_c++\Counter_DLL_Dev_C++\current.db", &datenbank) != SQLITE_OK)
{
}
sprintf( messwerte, "insert into messwerte (number, m01 , m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12, m13, m14 ,m15 ,m16) VALUES ((SELECT max(number) FROM messwerte)+1, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d ,%d ,%d, %d);", PInput[M01], PInput[M02], PInput[M03], PInput[M04], PInput[M05], PInput[M06], PInput[M07], PInput[M08], PInput[M09], PInput[M10], PInput[M11], PInput[M12], PInput[M13], PInput[M14], PInput[M15], PInput[M16] );
sqlite3_exec( datenbank , messwerte , NULL , NULL , NULL);
sqlite3_close(datenbank);
}
}
// Aufruf von PROFILAB, wird beim Simulations-Stop aufgerufen
DLLEXPORT void _stdcall CSimStop(double *PInput, double *POutput, double *PUser)
{
//nichts zu tun
}
// erforderlich für MessageBox
int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szComdLine, int iCmdShow);
//Aufruf von PROFILAB, wird im Configurations-Menü aufgerufen
DLLEXPORT void _stdcall CConfigure(double *PUser)
{
MessageBox(NULL,TEXT("nichts zu configurieren"),TEXT("Config"), MB_OK);
}
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
/* Returns TRUE on success, FALSE on failure */
return TRUE;
}
Lg Barbers