Problem mit eigener WF
-
Hallo Leute, ich schreib grad ne nichtverwaltete WF. Ich habe aber ein Problem bei der Ausführung: Ein nicht erlaubter Speicherzugriff:
Eine Ausnahme (erste Chance) bei 0x10001787 (JSWorkflowFoundation.dll) in JSWFTest.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xfeeeff06.
Unbehandelte Ausnahme bei 0x10001787 (JSWorkflowFoundation.dll) in JSWFTest.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xfeeeff06.Hier mein Code(Sorry aber großes Projekt = viel Code):
WorkflowDll.h
#include <queue> #include <windows.h> #pragma once #ifdef _USRDLL #define DLL __declspec(dllexport) #else #define DLL __declspec(dllimport) #endif class DLL Activity { protected: Activity(); //Privatekonstruktor = Abstrakte Klasse public: virtual void Invoke() = 0; virtual ~Activity(); }; class DLL CodeActivity : protected Activity { void (*funcptr) (); public: CodeActivity(); CodeActivity(void (*ptr)()); virtual ~CodeActivity(); virtual void Invoke(); virtual void SetFuncPtr(void (*ptr)()); virtual void(*GetFuncPtr())(void); }; class DLL WorkflowBase { HANDLE h; protected: std::queue<Activity*> *Activities; WorkflowBase(); virtual ~WorkflowBase(); virtual void __Start(); virtual void __Stop(); public: bool executenextactivity(); };Activity.cpp
#include "WorkflowDLL.h" Activity::Activity() { } Activity::~Activity() { }CodeActivity.cpp
#include "WorkflowDLL.h" CodeActivity::CodeActivity(void) { funcptr = 0; } CodeActivity::CodeActivity(void(*ptr)()) { funcptr = ptr; } CodeActivity::~CodeActivity(void) { } void CodeActivity::Invoke() { if(funcptr) { funcptr(); } } void CodeActivity::SetFuncPtr(void (*ptr)(void)) { funcptr = ptr; } void (*CodeActivity::GetFuncPtr())(void) { return funcptr; }WorkflowBase.cpp
#include "WorkflowDLL.h" DWORD WINAPI Work(LPVOID data); WorkflowBase::WorkflowBase() { Activities = new std::queue<Activity*>; } WorkflowBase::~WorkflowBase() { delete Activities; } void WorkflowBase::__Start() { h = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&Work, this, NULL, NULL); } void WorkflowBase::__Stop() { if(h) { CloseHandle(h); } } bool WorkflowBase::executenextactivity() { if(Activities->size()) { Activities->front()->Invoke(); Activities->pop(); return true; } else { return false; } } DWORD WINAPI Work(LPVOID data) { WorkflowBase *b = (WorkflowBase*)data; while(b->executenextactivity()); return 0; }Und schließlich noch main des Testprogramms.
#include <WorkflowDLL.h> #include <iostream> using namespace std; void Test(); class TestWorkflow : protected WorkflowBase { public: TestWorkflow() { CodeActivity *CodeActivity1; CodeActivity1 = new CodeActivity(&Test); Activities->push((Activity*)CodeActivity1); } void Start() { __Start(); } }; int main() { cout << "TestWf"; TestWorkflow *wf = new TestWorkflow(); wf->Start(); delete wf; cin.get(); return 0; } void Test() { cout << "Test"; }Hope you can help me!
-
Code-Tags bitte korrigieren. Hast du schon mal den Debugger benutzt? Wo genau treten die Exceptions auf?
-
Hi, danke das erstmal einer geantwortet hat. Code-Tags korrigieren? Wie? Ich habe versucht es hinzubekommen. Geht aber nicht.
Debuger? Ja, den hab ich benutzt. Ich hab in der Funktion Work einen Haltepunkt gesetzt wo die Queue angesprochen wird. Der Haltepunkt kommt und wenn ich dann weiter ausführe kommt an der Stelle die Ausnahme. Ich vermute es liegt daran das ich Work auf einem eigenen Thread ausführe. Aber in der .NET-WF läuft der Workflow doch auch auf einem anderen Thread.
Code-Tags korrigieren? Wie? Ich habe versucht es hinzubekommen. Geht aber nicht. ... Hab ich nie gesagt

-
Warum antwortet denn keiner?
-
Ok, wenn keiner antworten will...
Also ich hab nochmal ein bisschen am Code gebastelt. Ich hab in executenextactivity() ein WairForSingleObject eingefügt dass 100 min (hoffe mal hab die milliselunden richtig berechnet) wartet - funktioniert ist aber nicht das was ich brauche. Wenn ich das ding mal in ne GUI-Anwendung einbinde und via CodeActivity auf ein externes Ereignis warte (zb. warten das andere Anwendung via Sockets bestätigt) hängt sich die gesamte anwendung auf. Wer kann mir also bessere Lösungen anbieten?
-
Also ich hab jetzt ne Lösung. Für alle die die's intressiert:
WorkflowBase.cpp (Der Rest ist gelich):#include "WorkflowDLL.h" DWORD WINAPI Work(LPVOID data); WorkflowBase::WorkflowBase() { Activities = new std::queue<Activity*>; } WorkflowBase::~WorkflowBase() { __Stop(); delete Activities; } void WorkflowBase::__Start() { h = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&Work, this, NULL, NULL); } void WorkflowBase::__Stop() { if(h) { TerminateThread(h, -1); CloseHandle(h); h = NULL; } } bool WorkflowBase::executenextactivity() { if(Activities->size()) { Activities->front()->Invoke(); Activities->pop(); return true; } else { return false; } } DWORD WINAPI Work(LPVOID data) { WorkflowBase *b = (WorkflowBase*)data; while(b->executenextactivity()); return 0; }