Wunderbar, danke, so funktionierts! Die HidD_GetProductString() ist in Hid_GetName() gepackt, da ich dann noch weitere Dinge in der Funktion mit dem Rückgabewert der HidD_GetProductString() mache.
Frager schrieb:
Wenn ich
BackgroundImageLayout = ImageLayout.Center;
irgendwann im code mache gibt er mir immer:
Ungültige Parameter
weiß jemand wieso? BackgroundImage ist drinnen.
Ok... Hab es gelöst indem ich in der Paint funktion mit DrawImage es gemacht hab...
Knuddlbaer schrieb:
Wollen wir doch nicht vergessen, das der Tick des Timers im GUI Thread abläuft und somit für nebenbei aufgaben ungeeignet ist. Man muss also mindestens mal die Einschränkung auf System.Thread.Timer legen und somit auf den gesammten Bereich von System.Thread - also "dem groben Unfug im .Net"
Niemand hat gesagt, dass er den Forms Timer nehmen soll, der taugt nur was, wenn auch GUI Elemente im TimerTick verwendet werden sollen.
Wer hat gesagt, dass Threading in .NET Unfug ist? Ohne Threading kommt man kaum aus.
ja aber trotzdem ist mir unklar wie ich beim klicken auf das X effektiv den serialport zum schweigen bringen kann, ohne das mir das invoke dazwischen funkt, es muss doch eine praktikablere lösung geben als ein "com close" button vorher drücke zu müssen ... (von der usability her kann ich ja nicht vom andwender verlangen JEDEN threaded Vorgang vvon hand zu beenden bevor er auf das x drücken darf)
andere frage, wenn ich das beenden auf einen button lege bewegt sich der button doch ebenfalls im hauptthread, dann müsste das invoke ja ebenfalls so lange hängen bis ich die onclick beendet habe ... dann dürfte soch genau dasselbe problem entstehen wie beim x-drücken ... also ich empfinde den invoke als immer unpraktibkabler ... aber was besseres finde ich einfach nicht, bitte gebt mir noch ne alternative
Hi, etwas direktes gibt es in C# nicht, da scanf() nicht typsicher ist.
Aber schau dir mal die Klasse System.Convert bzw. die Methode Parse() bei den einzelnen Basis-Datentypen (Int32, Int64, UInt32...) an.
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.