Pfad erzeugen

Antworten
Simonfroehlich
Beiträge: 4
Registriert: Freitag 8. Februar 2013, 07:32

Pfad erzeugen

Beitrag von Simonfroehlich » Freitag 12. Juli 2013, 12:22

Hallo,
vielleicht kann mir jemand weiterhelfen.
ich versuche gerade eine DLL zu programmieren über VS C++2008.
Das Programm soll eine Pfad erstellen wenn dieser noch nicht existiert.

void _stdcall CCalculateEx(double *PInput, double *POutput, double *PUser, StringParam PStrings)
{
struct tm *LokalZeit;
time_t Zeit; time(&Zeit);
LokalZeit = localtime(&Zeit);
wchar_t wDateipfad[256];
bool Error;

char Artikel[256]="";
sprintf(Artikel,"R:\\In_Prod\\%s\\%d" , PChar(PStrings[ArtikelInPin]),LokalZeit->tm_year+1900 );
sprintf(PChar(PStrings[TestOutPin]),"%s", Artikel);
mbstowcs(wDateipfad, Artikel, strlen(Artikel)+1);//Plus null
Error = CreateDirectory(wDateipfad,NULL);
if (Error==false)
{
POutput[TestOutPin]=GetLastError();
}
Wenn ich das Programm mit einem Testprogramm in VS simuliere wird der Pfad erzeugt.
Lade ich die DLL in Profilab und führe das Programm aus, so wird der Pfad nicht erzeugt.

Mfg
Simon

IKT
Beiträge: 554
Registriert: Mittwoch 4. November 2009, 18:32

Re: Pfad erzeugen

Beitrag von IKT » Freitag 12. Juli 2013, 13:20

@simon
was im code sofort auffällt ...
Da sind 2 öffnende, geschweifte Klammern und nur 1 schliessende ... dies funktioniert niemals ... (egal welcher C dialekt).
Ansonsten verstehe ich die VS Syntax zu wenig ...
++++++
Gruss/regards IKT

Simonfroehlich
Beiträge: 4
Registriert: Freitag 8. Februar 2013, 07:32

Re: Pfad erzeugen

Beitrag von Simonfroehlich » Freitag 12. Juli 2013, 13:41

Ja ich habe nur den Teil reinkopiert der für die Pfad Erzeugung zuständig ist.

Das Programm lässt sich compilieren und die anderen Funktionen laufen in der DLL auch.

habe jetzt auch den Befehl mkdir() ausprobiert erzeugt aber wieder kein Pfad.

Mike D
Beiträge: 528
Registriert: Dienstag 14. Oktober 2008, 14:48
Wohnort: Elbe- Weser-Dreieck

Re: Pfad erzeugen

Beitrag von Mike D » Montag 15. Juli 2013, 09:05

Moin,
was wird denn an TestOutPin ausgegeben?

Simonfroehlich
Beiträge: 4
Registriert: Freitag 8. Februar 2013, 07:32

Re: Pfad erzeugen

Beitrag von Simonfroehlich » Montag 15. Juli 2013, 14:28

Hallo,

der ist nur zum testen.
Gebe einen String oder double aus.

Mein Programm funktioniert so wie ich es geschrieben habe, wenn mein Pfad auf kein Netzwerklaufwerk zugreift.
Vielleicht kann mir jemand sagen warum das so ist.

Gruß

Simon

Mike D
Beiträge: 528
Registriert: Dienstag 14. Oktober 2008, 14:48
Wohnort: Elbe- Weser-Dreieck

Re: Pfad erzeugen

Beitrag von Mike D » Montag 15. Juli 2013, 14:39

Simonfroehlich hat geschrieben:der ist nur zum testen.
das war mir schon klar, ich meinte mit meiner Frage: was wird ausgegeben wenn die DLL in PL aufgerufen wird, ein String mit sinnvoller Pfandangabe oder ein Fehler?

Außerdem: CCalculateEx wird nicht nur einmal in PL aufgerufen, sondern bei jedem Simulationsdurchlauf, also versuchst du mit min 1000Hz einen neuen Pfad anzulegen.
Was macht die DLL denn sonst noch?

Mike

Simonfroehlich
Beiträge: 4
Registriert: Freitag 8. Februar 2013, 07:32

Re: Pfad erzeugen

Beitrag von Simonfroehlich » Dienstag 16. Juli 2013, 08:25

Hier mal die ganze Funktion von CCalculateEx

Der Pfad, so wie die Textfile wird nur einmal erzeugt oder überprüft ob sie schon existiert.
Wird der Name der Textfile verändert, so wird diese neu erzeugt.

File *fp muss Global deklariert werden.

DLLEXPORT void _stdcall CCalculateEx(double *PInput, double *POutput, double *PUser,StringParam PStrings)
{

char Temp[100]="";
wchar_t wTemp[100];
char cDateipfad[100]="";
wchar_t wDateipfad[100];

char dateiname[256]="";
struct tm *LokalZeit;
time_t Zeit;
time(&Zeit);
LokalZeit = localtime(&Zeit);
//-------------------------Datei Pfad erzeugen oder überprüfen ob dieser schon exisitiert.---------------
if (StatusDateipfad==false)
{
sprintf(cDateipfad,"c:\\ETWDevice\\%s",PChar(PStrings[ArtikelInPin]));//, timeinfo->tm_year+1900);
mbstowcs(wDateipfad, cDateipfad, strlen(cDateipfad)+1);

CreateDirectoryW(wDateipfad, NULL);

sprintf(cDateipfad,"c:\\ETWDevice\\%s\\%d",PChar(PStrings[ArtikelInPin]),LokalZeit->tm_year+1900);
mbstowcs(wDateipfad, cDateipfad, strlen(cDateipfad)+1);

if(CreateDirectoryW(wDateipfad, NULL))
{
StatusDateipfad=true;
}
else if (GetLastError()==ERROR_ALREADY_EXISTS)
{
StatusDateipfad=true;
}
else if (GetLastError()==ERROR_PATH_NOT_FOUND)
{
MessageBoxW(NULL,TEXT("ERROR_PATH_NOT_FOUND"),TEXT("Config"), MB_OK);
}
}
//---------------------------------------------------------------------------------------------------------
//--------------------------------Textfile erzeugen--------------------------------------------------------
if((PInput[TaktInPin]==0&&Takt_OLD==true)&&StatusDateipfad==true)
{
Takt_OLD=false;
switch (Counter)
{
case 0://1. Überprüfen der Daten und Kopfzeile erzeugen.
{
if(PInput[PrueferInPin]==0){MessageBoxW(NULL,TEXT("Kein Prüfer eingetragen"),TEXT("Fehler"), MB_OK);}
else if(PInput[FANrInPin]==0){MessageBoxW(NULL,TEXT("Keine FA-Nr vorhanden"),TEXT("Fehler"), MB_OK);}
else if(PInput[SNrInPin]==0){MessageBoxW(NULL,TEXT("Keine S-Nr vorhanden"),TEXT("Fehler"), MB_OK);}
else
{
sprintf(Temp,"c:\\ETWDevice\\%s\\%d\\%d.txt",PChar(PStrings[ArtikelInPin]),
LokalZeit->tm_year+1900,
(int) PInput[SNrInPin] );
mbstowcs(wTemp, Temp, strlen(Temp)+1);

fp = fopen( Temp,"a"); // Datei neu erzeugen bzw. weiterschreiben,wenn sie schon existiert.
fprintf(fp, "\n**************************************************\n");
fprintf(fp, "Prüfprogramm: %s",PChar(PStrings[ArtikelInPin]));
fprintf(fp, "\n**************************************************\n\n");
fprintf(fp, "Datum: %02d:%02d:%02d - %02d.%02d.%d\n", LokalZeit->tm_hour,
LokalZeit->tm_min,
LokalZeit->tm_sec,
LokalZeit->tm_mday,
LokalZeit->tm_mon+1,
LokalZeit->tm_year+1900);
fprintf(fp, "Prüfer: %d\n",(int)PInput[PrueferInPin]); // reinen Text "Hallo!" in die Datei schreiben
fprintf(fp, "FA-Nr.: %d\n",(int)PInput[FANrInPin]);
fprintf(fp, "Seriennr.: %d\n",(int) PInput[SNrInPin]);
fprintf(fp, "\n--------------------------------------------------\n");
fprintf(fp, "\n------------------Prüfschritte--------------------\n\n");
StatusHeaderFile=true;
Counter++;
}
}
break;

case 1://Prüfschritte werden so lange wiederholt, bis ein Impuls am Eingang "Speichern" aktiv wird.
{
fprintf(fp,"- %s: %s\n", PChar(PStrings[PruefschrittInPin]),
PChar(PStrings[ErgebnisInPin]));
}
break;
default:
{
}
}
}
else if(PInput[TaktInPin]==5)
{
Takt_OLD=true;
}
//----------------------------------------------------------------------------------------------------------
POutput[TestOutPin]=Counter;

if(PInput[SpeichernInPin]==0&&Speichern_OLD==true)
{
Speichern_OLD=false;

if (Counter>0)
{
Counter = 0;
fprintf(fp, "\n-----------------------Ende-----------------------");
fprintf(fp, "\n**************************************************\n");
fclose(fp); // Datei schließen wenn eine offen ist.
}

}
else if (PInput[SpeichernInPin]==5)
{
Speichern_OLD=true;
}
}

Hier noch die Textfile, die erzeugt wird.

**************************************************
Prüfprogramm: XXX
**************************************************

Datum: 09:14:13 - 16.07.2013
Prüfer: XXX
FA-Nr.: XXXX
Seriennr.: XXX

--------------------------------------------------

------------------Prüfschritte--------------------

- Spannung 3,3V: 3,3125
- Spannung 24V: 24,25
- Spannung 12V: 12,25
- Freigabe: OK
- Aktor: OK

-----------------------Ende-----------------------
**************************************************
Gruß
Simon

Antworten

Zurück zu „DLL-Programmierung“