Laden...

Forenbeiträge von Sirox Ingesamt 64 Beiträge

17.06.2008 - 11:02 Uhr

Hi,

um euch auf den neusten Stand zu halten 😄. Ich hab angefangen jetzt TAPI3 zu wrappen mit c++/cli, weil ich mir gedacht habe wenn ich da nicht weiterkomme kann ich mich ja ein bisschen in c++/cli einlesen. Derzeit bin ich mit meinem TAPI3 Wrapper weiter, wie mit der alten Methode über pinvoke und TAPI2.

lg

13.06.2008 - 15:10 Uhr

Hi,

@Ronny, ich kenn den Wrapper von Julmar, ich würde aber gerne selber so einen wrapper schreiben.

Ich habe soviel rausgefunden:
Da Tapi3 ein COM-Interface ist und zwar ein ziemlich kompliziertes funktioniert es nur Teilweise in einfacher form mit dem "automatischen COM-Wrapper" vom Visual Studio.
Wann man im Visual Studio ein COM-Interface als Verweis benutzt wird es mit einem "automatischen Wrapper" zugänglich gemacht. Da es bei COM normal ist dass man seine erstellten Objekte auch selber wieder frei gibt und beim c# nicht ( da übernimmt dass der Garbagecollector ) kann es vorkommen dass Objekte länger nicht fregegeben werden als sie eigentlich gebraucht werden. Tapi ist so aufgebaut dass Teilweise sachen nicht nochmal Funktionieren solange das "alte" nicht vorbei ist und so kann es z.B. zu verschluckten Events kommen usw. ( Wenn ich bei dem oberen Text falsch liege bitte berichtigt mich )

Ich hab mir deswegen gedacht, dass ich erst mal mit tapi2 anfange und das wrappen über den pinvoke der tapi32.dll. Ich hab es auch schon geschaft tapi zu initialisieren freu 😄!

Jetzt hab ich aber ein neues Problem und zwar mit der funktion linegetdevcaps.
Diese funktion muss man zweimal aufrufen, einmal um den platzbedarf der zu übergebenden Struktur zu bekommen und einmal um die vollständigen Infos zu dem Device zu bekommen.

Hier mal der Codeausschnitt wie es in C gemacht wird


...
            LINEDEVCAPS LineDevCaps;
            LineDevCaps.dwTotalSize = sizeof(LineDevCaps);
            if(0 == lineGetDevCaps(hLineApp, dwCurrentDevID,
                                   dwAPIVersion, 0, &LineDevCaps))
            {
                BYTE* pLineDevCapsBytes = new BYTE[LineDevCaps.dwNeededSize];
                if(0 != pLineDevCapsBytes)
                {
                    LINEDEVCAPS* pLineDevCaps = (LINEDEVCAPS*)pLineDevCapsBytes;
                    pLineDevCaps->dwTotalSize = LineDevCaps.dwNeededSize;
                    if(0 == lineGetDevCaps(hLineApp, dwCurrentDevID,
                                           dwAPIVersion, 0, pLineDevCaps))
                    {
...

wie macht man das in c#? ich kann kein byte-array zu einer Structur casten schon gar nicht wenn die structur am Ende größer sein soll wie sie eigentlich ist.

Danke für eure hilfe 😉

lg

11.06.2008 - 15:45 Uhr

Ich schau bei so sachen immer gerne unter pinvoke.net nach:
ShowWindow
Da steht das Enum dabei

lg

11.06.2008 - 15:17 Uhr

Hey Leute,

ich versuch gerade ein Programm zu schreiben, dass mir bei einem Anruf die Nummer des Anrufers anzeigt. Ich hab das ganze schon versucht mit der tapi3.dll über verweise einbinden und dan ( managed ) auf die tapi zu zu greiffen. Das funktionierte nicht so ganz mit den events, sie wurden nur beim ersten Anruf geschmissen ... naja ! Ich fand dann auch diesen Artikel von Microsoft:
http://support.microsoft.com/default.aspx?scid=kb;en-us;841712
Da steht drinnen dass das gar nicht geht was ich vor hatte. So und jetzt zu meiner Frage gg
Wenn da jetzt steht ich soll da unmanaged drauf zugreiffen heist das ich muss die tapi3.dll mit pinvoke benutzen oder muss ich direkt in c++ eine dll schreiben die da drauf zugreift ?

liebe Grüße

04.10.2007 - 17:39 Uhr

Hi Leute,

geht das, dass ich ein Objekt im Speicher ersetzte, also dass alle Referenzen die vorher auf das alte Objekt referenziert haben auf das neue object referenzieren ?

Also ich muss ein Objekt durch ein anderes Ersetzen, weil eine Typumwandlung geschieht aber das neue Object ist von dem alten abgeleitet.

Danke für eure Hilfe.

Christian

22.06.2007 - 13:06 Uhr

Da es mit der Software von Digital-Persona funktioniert hab mal ein paar sachen versucht:

Ich hab rausgefunden , dass die Software von DigitalPersona die dpDevCtl.dll anspricht wenn man seinen Finger auf das gerät liegt.

In der Dll dpDevCtl.dll sind folgende Funktionen:

FD_CloseDevice
FD_CloseDeviceManager
FD_DllGetVersion
FD_Entry
FD_EnumerateDevice
FD_GetDataFormat
FD_GetDeviceInfo
FD_GetParameter
FD_OpenDevice
FD_OpenDeviceManager
FD_SetParameter
FD_TestDevice

jetzt weis ich nur noch nicht wie die Struktur der Funktionen aussieht, also welchen rückgabewert sie haben und welche Parameter sie benötigen.

Weis einer wie ich das rausfinde, da die Namen der Funtkionen sehr vielversprechend sind meiner Meinung nach

lG

22.06.2007 - 08:08 Uhr

Ich habs jetzt ein bisschen probiert und es ist gar nicht einfach, selbst mit der testapplikation von grfinger erkennt er meinen microsoft fingerprint reader nicht. Da rührt sich nix

lG

21.06.2007 - 14:12 Uhr

Irgendwas ist an dem ding brutal komisch !!
weis einer einen anderen Fingerprint-Reader, der leicht und köstengünstig zu programmieren ist ?
Also kostenloses SDK oder eine gute Doku zum hernehmen von dlls oder irgendwie so

lG

20.06.2007 - 13:48 Uhr

Hier gibts eine SDK für den Reader
http://www.griaule.com/page/de/downloads

aber bei mir wird der Reader nicht mal im Geräte-Manager erkannt wenn die mitgelieferte Software nicht installiert ist

19.06.2007 - 17:22 Uhr

Hmm joa, ich glaub man kanns dem Angreifer eig. nur versuch brutal schwer zu machen .Sobald irgendwas wieder entschlüsselt werden soll, ist auch irgendwo eine Angriffsmöglichkeit.

19.06.2007 - 17:10 Uhr

Hi,

Ahso gg jetzt hats klick gemacht.
Man kann wenigstens nicht einfach den Key irgendwo hinkopieren und das von dir dafür vorgesehene Programm zum entschlüsseln verwenden, da dies ja immer in die Seriennummer benutzt. Wie sieht es dann mit einer Mischung aus Hardwareseriennummer ( kann man die ProzessorID fälschen ?) und fest einprogrammiertem Key ( evtl initVector bei Rijndael ) aus ?

lg

19.06.2007 - 16:56 Uhr

Hi herbivore,

ich dachte die Seriennummer ist nicht so einfach fälschbar oder?

lg

19.06.2007 - 16:42 Uhr

Hi herbivore,

stimmt einerseits schon, aber wenn er Passwörter sicher abspeichern will , damit er diese irgendwo nicht immer eingeben muss finde ich das schon gut. Wenn die Festplatte ausfällt muss er die Passwörter halt nochmal neu eingeben

lG

19.06.2007 - 15:21 Uhr

Ich hab genau das selbe Problem.
Mein Ansatz wäre, dass der Schlüssel mit dem die Sachen ver und entschlüsselt wird aus den Hardwarekomponenten generiert werden, müsste ziemlich eindeutig sein.
So wird entsteht auf einem anderen PC ein anderer Schlüßel mit dem versucht wird die Daten zu entschlüsseln und du könntest die Verschlüsselten Daten nur mit dem PC wieder entschlüsseln, mit dem du sie verschlüsselt hast.

Edit : ich hab jetzt ein Bisschen nachgelesen , die Seriennummer der HDD sollte eindeutig sein oder ?

14.06.2007 - 19:11 Uhr

Ahh ok äm sorry 😁

Erst mal der TypeConverter


    public class DatumTypeConverter : TypeConverter {
        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) {
            if (sourceType == typeof(string))
                return true;

            return false;
        }

        public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) {
            if (value is String) {
                string[] Teile = ((string)value).Split('.');
                int Jahr = DateTime.MinValue.Year;
                int Monat = DateTime.MinValue.Month;
                int Tag = DateTime.MinValue.Day;

                if (Teile.Length >= 3)
                    if (!int.TryParse(Teile[2], out Jahr))
                        Jahr = DateTime.MinValue.Year;

                if (Teile.Length >= 2)
                    if (!int.TryParse(Teile[1], out Monat))
                        Monat = DateTime.MinValue.Month;

                if (Teile.Length >= 1)
                    if (!int.TryParse(Teile[0], out Tag))
                        Tag = DateTime.MinValue.Day;

                return new Datum(Jahr, Monat, Tag);
            }
            return null;
        }
    }

die Verbindung von Converter und Objekt geht dann über ein Attribut


    [TypeConverter(typeof(DatumTypeConverter))]
    class Datum : IComparable<Datum> {
             ....
    }

Das wars und schon kann ich im DataGridView mein eigenens Objekt editieren

lG

14.06.2007 - 19:02 Uhr

Ich habs geschafft, man muss einfach einen TypoConverter schreiben, der das Umwandeln von einem String in dein eigenes Objekt behandelt

PS: ich finde schon dass das ein Argument ist weil die .net Framework Klassen auch nicht mehr oder weniger Möglichkeiten haben wie ich

14.06.2007 - 18:32 Uhr

Joa ich weis aber irgendwas muss es da geben, DateTimes z.B. können auch so bearbeitet werden

14.06.2007 - 14:33 Uhr

Ich weis ja nicht ob das Problem noch aktuell ist aber:

EventHandler auf CellMouseDown


private void DataGrid_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) {
            DataGrid.ClearSelection();
            if (e.Button == MouseButtons.Right) {
                DataGrid.Rows[e.RowIndex].Selected = true;
            }
        }

lg

14.06.2007 - 12:47 Uhr

Hi Leute,
ich hab ein eigenes Datum-Objekt geschrieben, welches in einem anderen Objekt als Property ist. Jetzt hab ich einem DataGridView als DataSource eine Liste aus den Objekten gegeben ( die das Datum-Objekt als Property haben ). Mein Problem ist dass ich es nicht verändern kann, weil vermutlich das DataGridView nicht weis wie es den String in mein Datum-Objekt umwandeln soll.

vielen Danke für eure Hilfe

lG

06.06.2007 - 13:55 Uhr

lol stimmt da bin ich wohl aufn hirrn gesessen 🤔 ... , naja

dankeschön

06.06.2007 - 13:12 Uhr

Hi,

erst einmal ein beispiel

Zeitbereich1:
DateTime1 = 26.01.2007 19:00
DateTime1 = 26.01.2007 1:00

Zeitberech2:
DateTime1 = 26.01.2007 20:00
DateTime1 = 26.01.2007 6:00

i würde jetzt gerne wissen wievel Zeit beide gleich haben, also im Beispiel wären dass 5 Stunden.
Gibts das schon Methoden im Framework oder wie kann ich das berechnen ?

Lg

31.05.2007 - 11:04 Uhr

ok dann werd ich ihm diese zwei möglichkeiten anbieten.
Danke herbivor für deine Hilfe

Lg

31.05.2007 - 10:38 Uhr

gute frage 😁
ich wollte dem benutzer die Einstellmöglichkeit lassen ob die Statusform TopMost oder nur für die Anwendung ganz vorne angezeigt werden soll

31.05.2007 - 10:26 Uhr

Achso 😁
Die Form die immer im Vordergrund sein soll, ist eine Statusform die immer den aktuellen Status von etwas anzeigt, und dass würde ich gerne im Vordergrund haben dass die "normale" Form mit der man arbeitet diese Statusform nicht überdeckt.

31.05.2007 - 10:18 Uhr

Hi,
eig. will ich erreichen dass eine Form nicht TopMost aber immer vor einer anderen FORM ist

lG

31.05.2007 - 10:02 Uhr

Hi
ich will ein Fenster haben, dass immer vor einer MDI-Form ist also hab ich mir gedacht das geht ganz einfach

Form.show(mdiForm);

aber dann wird die Form immer minimiert wenn die MDI-Form minimiert wird, kann man das verbieten ?

danke für eure Hilfe

lG

25.05.2007 - 11:05 Uhr

Hi herbivore,

Entschuldigung ich war Fest der Meinung, dass das Zuweisen selbst das Problem ist. Doch es war durch eine im set bereich der Property- Aufgerufener Event der noch einen Event Aufreif und der wollte den string bearbeiten, welcher ja dann null war.

Sorry nochmal und vielen Dank

lG

25.05.2007 - 10:52 Uhr

Hi herbivore

Die zwei Anweisungen hab ich direkt hintereinander stehen und erst bei der zweiten Anweisung kommt die Exception.


Object.GetType().GetProperty("Kommentar").SetValue(Object, "", null); //Keine Exeption
Object.GetType().GetProperty("Kommentar").SetValue(Object, null, null); //NullReferenceException

25.05.2007 - 10:38 Uhr

Hi herbivore,
ich hab mir die FAQ schon durchgelesen, aber es ist kein Objekt null. Der wert den ich mit SetValue setzen will ist null ( 2.Parameter ), das ist mein Problem und der soll ja auch null sein weil ( wie im oberen Beispiel ) Kommentar auch null sein soll

25.05.2007 - 10:31 Uhr

Hi herbivore,
aber das Funktioniert ja


string tst = "";
tst = null;

wenn man dann im Debugger in das Objekt reinschaut ist der string null, deswegen versteh ich das nicht.

und mein Test-Code wo z.B. diese Exception kommt lautet :


Object.GetType().GetProperty("Kommentar").SetValue(Object, null, null);

wobei Kommentar eine string-Property ist

lG Christian

25.05.2007 - 10:15 Uhr

Hi,
ich hab folgendes Problem :
Ich will einen string über Reflection auf null setzten, normalerweise kann man ja einem string , null zuweisen, nur bei der Reflection bekomme ich immer eine TargetInvocationException mit einer InnerException : NullRefernceException.

Danke für euere Hilfe

lG

Christian

13.04.2007 - 18:34 Uhr

Hi,
ich habe bei einem Programm von mir einen Systemhook integriert über den ich Tasten abfangen kann , das geht ja auch ...
Nur will ich jetzt auch noch den Text der gedrückten Taste anzeigen lassen (quasi "return" oder "shift")
Ich hab gelesen dass das mit der Api GetKeyNameText geht ... ich schaffs aber einfach nicht

Vom System Hook kommt ein IntPtr mit dem lParam :


private IntPtr HookCallBack(int nCode, IntPtr wParam, IntPtr lParam)

der wird dann in eine KeyboardHookStruct umgewandelt


KeyInfo = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));

und dann wollt ich mit diesem Aufruf den Namen herrausfinden


StringBuilder sb = new StringBuilder(256);
uint key = (uint)KeyInfo.vkCode << 16;
GetKeyNameText(key, sb, 256);

Die Structur schaut so aus :


    public struct KeyboardHookStruct {
        public int vkCode;
        public int scanCode;
        public int flags;
        public int time;
        public int dwExtraInfo;
    }

und der P/Invoke so :


[DllImport("user32.dll")]
        static extern int GetKeyNameText(uint lParam, [Out] StringBuilder lpString, int nSize);

kann mir bitte einer helfen , ich bin total verzweifelt 😉

lg und Danke

Sirox

05.03.2007 - 15:05 Uhr

Hi , ich war an dem gleichen Problem ich hätte da nur eine Andere Lösungsart ( ich hab aber von oben gespickt 😁 ) aber die PInvokes haben mir nicht so gefallen also :



Excel.Application xlApp = new Excel.Application();
xlApp.Caption = xlGuid;
//In meinem Programm ist es so dass man das Fenster nicht sehn muss
xlApp.Visible = false;

//Workbook und Worksheet öffnen und sachen damit machen
           
//Hier muss das Fenster geöffnet werden sonst kann man es nicht Identifizieren, aber hald nur Minimiert so merkt nicht ( bzw. kaum )
xlApp.WindowState = Excel.XlWindowState.xlMinimized;
xlApp.Visible = true;

foreach (System.Diagnostics.Process procI in System.Diagnostics.Process.GetProcessesByName("EXCEL")){
      if (procI.MainWindowTitle.IndexOf(xlGuid) != -1) {
                    procI.CloseMainWindow();
                    procI.Refresh();
                    procI.Kill();
       }
}


So spart man sich den PInvoke

lG

Sirox

28.02.2007 - 13:14 Uhr

Verstehe ich das richtig ? Du willst nur verschieden Positionen speichern können ?

Ich würde das so machen:

Ein enum erstellen welches die verschiedenen Varianten beschreibt


    public enum FensterAnsichten {
        Standart,
        Erweitert
    }

Dann in deiner Form als Member


Dictionary<FensterAnsichten , Point> Ansichten = new Dictionary<int, Point>();

Hinzufügen geht dann mit


Ansichten.Add(FensterAnsichten.Standart,new Point(this.Left,this.Top));

Abrufen geht mit


this.Left = Ansichten[FensterAnsichten.Standart].X;
this.Top = Ansichten[FensterAnsichten.Standart].Y;

lG Sirox

PS: könnten kleine Fehler drinnen sein hab es jetzt einfach mal so hingeschrieben

28.02.2007 - 10:35 Uhr

kann mir keiner Helfen ? ich hab den fehler immer noch und ich glaub dass, der Fehler in meinem Code ist! Ich vermute visual c# stürzt ab weil der designer beim erstellen der Instanze der Form eine Exception bekommt.

Das Programm läuft aber ohne Probleme

27.02.2007 - 14:14 Uhr

Ich hab jetzt ein bischen rumprobiert und mit folgender Version geht es , frag mich nicht warum


private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e) {
            if (e.Node.Bounds == Rectangle.Empty)
                return;

            Brush brshBackGround = null;
            Font fntNode = null;

            //Hintergrundfarbe festlegen
            if ((e.State & TreeNodeStates.Selected) == TreeNodeStates.Selected)
                brshBackGround = Brushes.DarkBlue;
            else
                brshBackGround = Brushes.White;

            //Schriftart festlegen
            fntNode = e.Node.NodeFont;
            if (fntNode == null)
                fntNode = ((TreeView)sender).Font;

            //Hintergrund zeichnen
            e.Graphics.FillRectangle(brshBackGround, e.Node.Bounds);

            //Text zeichnen
            e.Graphics.DrawString(e.Node.Text, fntNode, Brushes.Black, e.Node.Bounds);

             e.DrawDefault = false;
        }

27.02.2007 - 10:32 Uhr

Hi,
ich versuche den Text von einem TreeView selbst zu zeichnen mit folgendem Code:



        private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e) {
            Brush brshBackGround = null;
            Font fntNode = null;

            //Hintergrundfarbe festlegen
            if ((e.State & TreeNodeStates.Selected) == TreeNodeStates.Selected)
                brshBackGround = Brushes.DarkBlue;
            else
                brshBackGround = Brushes.White;

            //Schriftart festlegen
            fntNode = e.Node.NodeFont;
            if (fntNode == null)
                fntNode = ((TreeView)sender).Font;

            //Hintergrund zeichnen
            e.Graphics.FillRectangle(brshBackGround, e.Bounds);

            //Text zeichnen
            e.Graphics.DrawString(e.Node.Text, fntNode, Brushes.Black, e.Bounds);
        }

aber irgendwie sieht das nicht sauber aus! Beim erstenmal öffnen werden alle Items ganz oben links hin gezeichnet und wenn ich durch die Items klicke dann sind überall so komische ränder zu sehen. Was mache ich falsch ?

26.02.2007 - 17:22 Uhr

Hi, versuchs mal mit der Veröffentlichen-Funktion von Visaul Studio
Erstellen -> programm Veröffentlichen und durchklicken

lG

26.02.2007 - 15:18 Uhr

Also ich habs mal kurz Ausprobiert und das was mich abgebracht hat SharpDevelop zu benutzen, ist dass man den Inhalt der Objekte im Debugging-Modus nicht so schön anschaun kann wie in Visual C#. Kann aber auch sein dass es irgendwie geht ich habs echt nur ganz kurz angesehen!

Dann ist die Programmieren mit dem .net compact framework aufwendig zum laufen zu bringen, näher hab ich mir die IDE auch nicht angesehen sorry!

lG

26.02.2007 - 15:07 Uhr

Ja es gibt eine Alternative, sie heist SharpDevelop und ist sogar OpenSource kann leider nur nicht so viel wie VS

http://www.icsharpcode.net/OpenSource/SD/

lg Sirox

26.02.2007 - 14:22 Uhr

Hi leute,
ich wenn an meinem Projekt arbeite, dann stürzt mir immer wieder mein Visual C# ab, aber ich weis nicht warum.

Visaul C# fordert dann auf den Fehlerbericht zu Microsoft zu senden und da steht volgendes drin:

EventType : clr20r3 P1 : vcsexpress.exe P2 : 8.0.50727.762
P3 : 457150e1 P4 : ws1components P5 : 1.0.0.0 P6 : 45e2daf5
P7 : 644 P8 : 576 P9 : system.exception

Was bedeutet das ganze ? Wie kann ich aus sowas schlau werden ?

lG Sirox

17.01.2007 - 15:30 Uhr

Ich kann nichts auffälliges finden... ihr ? Wenn man den Timer in die Form zieht wird der konstruktor in der InizializeComponet() mit einem Parameter aufgerufen... wie schafft man sowas ?

17.01.2007 - 15:11 Uhr

Wo kann ich mir den Quelltext von z.B. vom Timer ansehen ?

17.01.2007 - 13:12 Uhr

Jetzt hab ich versucht das Objekt nicht über die Methode InitializeComponent() zu Erzeugen sondern direkt im Konstruktor ( da hat ja dann der Designer keinen einfluss ) aber Anzeigen tut er mein Control dafür leider auch nicht

17.01.2007 - 12:02 Uhr

Das ist eine Referenz auf ein anderes Control, mit dieses Control zusammenspielt, nein ich brauch den Wert definitiv im Konstruktor und da muss es auch irgendwas geben. Bei den eingebetteten Controls von M$ gibts auch einige, die im designer mit einem Parameter aufgerufen werden!

17.01.2007 - 11:57 Uhr

Irgendwas muss es da geben, ich hab mir die .Designer.cs angesehen , da gibts bereits Controls die von Hausaus mit einem Parameter gestartet werden ( z.B. System.ComponentModel.ComponentResourceManager ) aber wenn ich den Konstruktor mit Parameter da händisch eingebe, dann ist da nach der nächsten Änderung im Designer wieder der Konstruktor ohne Parameter drinnen

17.01.2007 - 11:53 Uhr

Das Problem ist ich brauch den Wert umbedingt im Konstruktor

17.01.2007 - 11:44 Uhr

aber am allercoolsten wäre wenn mir einer sagen würde ob/wie man einem Designer kann welchen Wert er für den Parameter mitgeben soll

17.01.2007 - 11:38 Uhr

COOOL danke danke , muss ich gleich ausprobieren!

17.01.2007 - 11:15 Uhr

schade, naja ok ... danke für die Hilfe!