Y
Mich haben nur deine Aussagegen irritiert.
Mmacher schrieb:
Des weiteren gibst Du einen Pointer auf eine lokale Variable zurück, d.h. der Inhalt auf den fromClipboard zeigt ist ungültig, da Lebensdauer nur innerhalb der Funktion!
string fromClipboard;
...
return fromClipboard;
Es handelt sich hierbei um einen std::string und wo jetzt deiner Meinung nach ein Zeiger zurück gegeben wird, sehe ich auch nicht. Das ist eine wohl definierte Operation, sofern sie nicht über Modulgrenzen hinweggeht.
Und da sehe ich auch das Problem bei der Sache: Die Benutzung von STL-Objekten zwischen exe und dll, also die Allokation von Speicher im dll-Code und Freigabe in der Anwendung. Dass es klappt, hängt meiner Meinung nach von zu vielen Faktoren ab, erstmal natürlich der gleiche Compiler, vermutlich die gleiche Version (Release/Debug), gleiche Codeerzeugung etc..
Deshalb würde ich auch davon abraten und nur eingebaute Typen im Dll-Interface verwenden (intern kann selbstverständlich auf beiden Seiten die STL verwendet werden).
Also aus
static string GetClipData();
Nun die Version
size_t GetClipData(char* buf, size_t buflen);
Falls für buf NULL angegeben wurde, wird die Länge des Clipboardinhalts geliefert, andernfalls war die Operation bei einem Wert ungleich 0 erfolgreich.
Anwender können die Funktion dann so benutzen:
size_t len = GetClipData(NULL, 0);
if(len)
{
std::vector<char> buf(len+1);
if(GetClipData(&buf[0], len+1))
{
string s = &buf[0];
...
}
}
Mit einem kommenden C++0x-Compiler kann der Umweg über den vector ausgelassen werden, noch ist aber nicht garantiert, dass der Buffer eines Strings an einem Stück im Speicher liegt.
Natürlich müssen die Rückgabewerte der Funktionen überprüft werden und vor allen Dingen, wie schon mehrfach geschrieben, geschaut werden, ob das passende Format in der Zwischenablage ist, aber wenn dies der Fall ist, finde ich die Aussage
MMacher schrieb:
Daß Deine Konsolen-App nicht abstürzt ist höchstwahrscheinlich purer Zufall!
etwas weit hergeholt.