Unbehandelte Ausnahme bei Dll
-
Hallo, ich bin neu hier aber hab schon ein bisschen erfahrung mit c++.
Mein Problem ist ich hab eine DLL erstellt und diese in mein Test Programm eingebunden , blos nachdem das Programm gestartet ist gibt er mir die Fehlermeldung aus:
Unbehandelte Ausnahme bei 0x641312D3 (Keypress.dll) in TestStation.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x003F0000Hier die Header.h in der DLL:
#include <string> #include <Windows.h> #include <iostream> using namespace std; namespace Keypress { class Keypressfunc { public: static __declspec(dllexport) string Presskey(string expstring); }; }Und die Quelle.cpp der DLL:
#include "Header.h" #include <string> #include <Windows.h> #include <iostream> using namespace std; namespace Keypress { string Keypressfunc::Presskey(string expstring) { int lofstr = 0; int iofkey = 0; lofstr = expstring.length(); for (iofkey = 0;iofkey < lofstr;iofkey++) { if (isupper(expstring.at(iofkey))) { keybd_event(VK_LSHIFT , 0, 0, 0); keybd_event(VkKeyScan(expstring.at(iofkey)),0x9e, 0 , 0); keybd_event(VkKeyScan(expstring.at(iofkey)),0x9e, 0 , KEYEVENTF_KEYUP); keybd_event(VK_LSHIFT ,0, KEYEVENTF_KEYUP, 0); } else if (expstring.at(iofkey) == ':') { keybd_event(VK_LSHIFT , 0, 0, 0); keybd_event(VkKeyScan(expstring.at(iofkey)),0x9e, 0 , 0); keybd_event(VkKeyScan(expstring.at(iofkey)),0x9e, 0 , KEYEVENTF_KEYUP); keybd_event(VK_LSHIFT ,0, KEYEVENTF_KEYUP, 0); } else if (expstring.at(iofkey) == '\\') { keybd_event(VK_LCONTROL,0,0,0); keybd_event(VK_LMENU,0,0,0); keybd_event(VkKeyScan(expstring.at(iofkey)),0,0,0); keybd_event(VkKeyScan(expstring.at(iofkey)),0,KEYEVENTF_KEYUP,0); keybd_event(VK_LMENU,0,KEYEVENTF_KEYUP,0); keybd_event(VK_LCONTROL,0,KEYEVENTF_KEYUP,0); } else { keybd_event(VkKeyScan(expstring.at(iofkey)),0x9e, 0 , 0); keybd_event(VkKeyScan(expstring.at(iofkey)),0x9e, KEYEVENTF_KEYUP, 0); } } lofstr = 0; iofkey = 0; return 0; } }Und noch die .cpp vom Test Programm:
#include "stdafx.h" #include <string> #include <iostream> #include <fstream> #include <windows.h> #include <sstream> #include "Header.h" using namespace std; using namespace Keypress; int _tmain(int argc, _TCHAR* argv[]) { string expstring ("Hallo"); Sleep(2000); Keypressfunc::Presskey(expstring); return 0; }so als Anmerkung: Ich arbeite mit MVS 2012.
Ich hoffe ihr könnt mir helfen.

Grüsse Benjamin
-
So, ich habe ein bisschen experimentiert und herausgefunden das der Fehler definitiv am übertragen des Strings liegt.
Hat jemand eine Idee wie ich den String vernünftig in meine DLL importiere?
Oder kann man einfach kein String importieren?Grüße Benjamin
-
Das DLL-Interface sollte möglichst C-Style sein, weil du ansonsten Probleme mit unterschiedlichen Compilern/Compilerversionen bekommen kannst.
Wenn du mit dem selben Compiler die Anwendung kompilierst, mit der die DLL kompiliert wurde, dann ist das in Ordnung. Ansonsten solltest du darüber nachdenken, keine Exceptions durchfliegen zu lassen, exportierte Funktionen mit extern "C" zu schmücken und keine STL oä. im Interface zu verwenden.
Zb. so ...
extern "C" __declspec(dllexport) size_t Keypress_Keypressfunc_Presskey(char const* expstring, char* resultBuffer, size_t bufferLength) { string result = Keypress::Keypressfunc::Presskey(expstring); if(result.size() > bufferLength - 1) return ERROR_BUFFER_TOO_SMALL; size_t copied = result.copy(resultBuffer, bufferLength - 1); resultBuffer[copied] = 0; return copied; }
-
Ethon schrieb:
Das DLL-Interface sollte möglichst C-Style sein, weil du ansonsten Probleme mit unterschiedlichen Compilern/Compilerversionen bekommen kannst.
Wenn du mit dem selben Compiler die Anwendung kompilierst, mit der die DLL kompiliert wurde, dann ist das in Ordnung. Ansonsten solltest du darüber nachdenken, keine Exceptions durchfliegen zu lassen, exportierte Funktionen mit extern "C" zu schmücken und keine STL oä. im Interface zu verwenden.
Zb. so ...
extern "C" __declspec(dllexport) size_t Keypress_Keypressfunc_Presskey(char const* expstring, char* resultBuffer, size_t bufferLength) { string result = Keypress::Keypressfunc::Presskey(expstring); if(result.size() > bufferLength - 1) return ERROR_BUFFER_TOO_SMALL; size_t copied = result.copy(resultBuffer, bufferLength - 1); resultBuffer[copied] = 0; return copied; }Vielen vielen Dank!! hat mir sehr geholfen, anscheinend kann man ein String bei meiner Lösung einfach nicht übertragen.
Ich poste mal meine Lösung vielleicht ist damit auch Anderen geholfen.

Dll Header:
#include <string> #include <Windows.h> #include <iostream> using namespace std; namespace Keypress { class Keypressfunc { public: static __declspec(dllexport) void Presskey(char const* importchar); }; }Dll cpp:
#include "Header.h" #include <string> #include <Windows.h> #include <iostream> using namespace std; namespace Keypress { void Keypressfunc::Presskey(char const* importchar) { string workstr = importchar; } }und die cpp vom Programm:
#include "stdafx.h" #include "Header.h" #include <string> #include <Windows.h> #include <iostream> using namespace std; using namespace Keypress; int _tmain(int argc, _TCHAR* argv[]) { char const* importchar("Hallo"); Keypressfunc::Presskey(importchar); return 0; }PS: das mit extern "C" brauche ich im Prinzip nicht da ich immer mit VS 2012 Arbeite, aber trotzdem vielen Dank.
Grüße Benjamin