Hallo zusammen,
nun ich habe es jetzt geschafft, die DLL wie gewünscht anzusprechen. Ob die Lösung ideal ist, weiß ich nicht zumindest funktioniert es jetzt.
Ich habe in der C++ DLL einen Wrapper geschrieben der so aussieht.
#pragma managed
#pragma warning(disable:4786)
#pragma warning(disable:4290)
#pragma warning(disable:4996)
__gc public class ReqManClass
{
public:
String* getBalance(char* ip, char* port, char* cardid)
{
Request req;
Response res;
int ret;
req.setTransType(transtype::GET_BALANCE);
req.setCardId(cardid);
ret = Gateway::doTrans(ip,port,req,res);
balance = (String*)res.getAmount();
return balance;
}
private:
String* balance;
Somit konnte ich die C++ DLL in mein C# Projekt einbinden.
Dann habe ich eine Instanz von der Wrapper Klasse in mein C# Projekt eingebunden. Hier die Funktion, die die C++ DLL aufruft.
public unsafe string getBalance(string dIP, string dPort, string CardID)
{
byte[] domainIp;
byte[] domainPort;
byte[] byteCardId;
domainIp = System.Text.Encoding.ASCII.GetBytes(dIP);
domainPort = System.Text.Encoding.ASCII.GetBytes(dPort);
byteCardId = System.Text.Encoding.ASCII.GetBytes(CardID);
sbyte[] sdomainIp = (sbyte[])(Array)domainIp;
sbyte[] sdomainPort = (sbyte[])(Array)domainPort;
sbyte[] sbyteCardId = (sbyte[])(Array)byteCardId;
[b]ReqManClass Request = new ReqManClass();[/b]
String balance;
unsafe
{
fixed (sbyte* psdomainIp = sdomainIp)
fixed (sbyte* psdomainPort = sdomainPort)
fixed (sbyte* psbyteCardId = sbyteCardId)
{
balance = Request.getBalance(psdomainIp, psdomainPort,psbyteCardId);
}
return balance;
}
Die Funktionen die mir Probleme bereitet haben, werden jetzt in der Wrapper Klasse der C++ DLL aufgerufen, ich musste mich nur noch um char* Problem in C# kümmern, was ich wie oben zu sehen mit sbyte[], bzw. sbyte* lösen konnte.
Zumindest läuft es
Danke für die vielen Antworten.
Gruß
Pierre
Wenn du mit Nachricht ein Ereignis (Event) meinst, kannst du das Event OnTextChanged implementieren. Dort kannst du die KeyCodes abfragen und entsprechend reagieren.
Bassmaster schrieb:
Naja du musst das so sehen angenommen du bist irgendwo und musst irgendwas Hämmern aber weit und breit ist nirgends wo ein Hammer zu finden und du musst ganzzzzz drigend irgendwas Hämmern, und du hast nur deinen Schraubenzieher, dann würde ich mir das doch nochmal überlegen
Ihr seid beide im falschen Forum.
@Ceos
Poste doch nächstes mal doch die Lösung. So können andere auch davon profitieren.
-> Aufrufe von nicht UI Threads müssen via Control.Invoke auf den entsprechenden UI Thread gemarshallt werden.
simon
Helfer schrieb:
My sorry war meine schuld hab vergessen das mit zuschreiben...
Das macht Dich zwar sehr sympathisch, ist aber natürlich Unsinn. Ein Bisschen muss ich auch selber können Bin Dir für das, was Du geschrieben hast, mehr als dankbar.
Ich möchte mit C# eine Access-Datenbank erstellen. Dafür habe ich folgenden Code gefunden:
private void DatenbankErstellen()
{
ADOX.CatalogClass cat = new ADOX.CatalogClass();
cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=D:\\NewMDB.mdb;" +
"Jet OLEDB:Engine Type=5");
MessageBox.Show("Die Datenbank wurde erfolgreich erstellt!", "Datenbank", MessageBoxButtons.OK, MessageBoxIcon.Information);
Console.WriteLine("Database Created Successfully");
cat = null;
}
Rufe ich im Ereignis Shown nun die Methode "DatenbankErstellen" auf, erhalte ich folgende Meldung:
Das Microsoft Jet-Datenbankmodul kann die Datei 'D:\NewMDB.mdb' nicht öffnen. Sie ist bereits von einem anderen Benutzer exklusiv geöffnet, oder Sie benötigen eine Berechtigung, um die Daten lesen zu können.
Liegt das eventuell an den Zugriffsrechten von Vista oder wer kann mir da weiterhelfen?
Also ich hab gesucht wie verrückt, und nie das gefunden was ich wollte.
Und den Streamwriter zu benutzen hab ich auch versucht...Bild wird z.B. nicht richtig gespeichert.
Das einzige was richtig funktioniert, war das erste Codebeispiel, was ich gepostet hab....
Jedoch missfällt mir die Sache mit der Vordefinierten Puffergröße.
Oder gibts evtl noch bessere Möglichkeiten?
Da ich die FTP-Verbindung in einzelnen Funktionen jeweils Öffnen und schließen will,
und andere Funktion (für aktionen) darauf aufbauen will...
http://entwickler-forum.de/showthread.php?t=28600
http://entwickler-forum.de/showthread.php?t=1641 <- für Cypress Usb Controller
mehr fand ich leider nicht
Hier ist der Code von C++/CLI, sollte sich aber in C# anpassen lassen.
Den legst Du in das Ereignis "KeyDown"
if (e->KeyCode == Keys::F1)//Suche per F1-Taste starten
{
//Anweisung;
}
Gruß, Doug_HH