Kann man diese DLL noch einbinden ?

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Kann man diese DLL noch einbinden ?

    Kann ich sie noch benutzen ? 5
    1.  
      Ja (3) 60%
    2.  
      Ne kannste vergessen. (2) 40%
    Hallo Leute,

    ich habe mich gefragt, ob und wenn mit welcher Programmiersprache, es noch möglich ist diese DLL zu nutzen. Jetzt ist die Frage, welche DLL. Es handelt sich um die sogenannte "homeputer.dll". Wie kennt niemande ? :D Ne ist mir klar das die niemand kennt. Aber sie ist auch schon recht alt, und so oft habe ich mit DLL auch noch nicht gearbeitet, deshalb weiß ich nicht ob es überhaupt noch möglich wäre. Am liebsten wäre es mir, wenn ich sie in C# zum laufen bekäme. Ich habe mal auf meinem Server die einzige Beschreibung die ich dazu habe hochgeladen als DLL, sodass man sich das direkt im Browser ankucken kann:
    noim.io/homeputer_DLL_Beschreibung.pdf
    Das einzige Original Projekt wo sie genutzt wurde, das ich hätte wäre aus VB6, und das ist so viel wirres und unverständliches Zeuge noch zusätzlich dabei wo ich mit den tausend Dateien keinen Überblick mehr habe. Einfach so in vb.net konnte ich sie nicht einbinden. Hat jemand vielleicht eine Idee ?

    Nils
    Versuchs doch einfach. Da die DLL in C geht, kannste auch PInvoke nutzen.
    Übrigens: +1 für kurzen Website-Namen, .io-Domain und https ;)

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Danke.

    Also es würde gehe ? Und nachdem ich mal gegooglt habe was PInvoke ist, war ich auch nicht wirklich schlauer. Also man soll damit irgendwie DLLs importieren können aber wie :D Die Website pinvoke.net hat mich dann auch gleich erschlagen.


    //EDIT:

    Also so ähnlich, oder ?:

    C#-Quellcode

    1. [DllImport("homeputer.dll")]
    2. public static extern int InitDLL();



    Vollzitate entfernt
    -Artentus

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Artentus“ ()

    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    OMG OMG OMG OMG ES FUNKTIONIERT AHHHHHHHHHHHH

    Ich konnte gerade damit das Licht auf dem Dachboden anmachen xD

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Runtime.InteropServices;
    5. using System.Text;
    6. using System.Threading.Tasks;
    7. namespace HomeOnFire
    8. {
    9. class Program
    10. {
    11. [DllImport("homeputer.dll")]
    12. public static extern int homeputer_InitDLL();
    13. [DllImport("homeputer.dll")]
    14. public static extern int homeputer_SetObjValName(String Objektname, String Objektwert);
    15. static void Main(string[] args)
    16. {
    17. homeputer_InitDLL();
    18. homeputer_SetObjValName("Licht_DG", "an");
    19. Console.Read();
    20. }
    21. }
    22. }

    Es geht ich bin so glücklich. Danke für die Hilfe. Werde für die Umsetzung aber mit Sicherheit noch Hilfe brauchen.#

    Ich habe keine Ahnung wie ich das mit dem:

    C#-Quellcode

    1. homeputer_SetWindowHandle(Handle)

    machen soll.
    Die Beschreibung ist ja wie folgt:
    Mit dieser Funktion kann das Handle eines Fensters an die DLL übergeben werden. Sobald ein Handle ungleich 0 übergeben worden ist, wird bei jeder Objektänderung innerhalb der Studio-Software eine Message an das Fenster mit diesem Handle gesendet. Die Message-Id ist 3074. Im Parameter WParam wird der Index des aktuell veränderten Objekts übergeben. Diese Meldung kann vom Anwenderprogramm abgefangen werden. Damit kann event-gesteuert auf Änderungen reagiert werden. Aufrufparameter : Fensterhandle Rückgabewert : 1 wenn das Setzen des Handles erfolgreich war 0 wenn das Setzen des Handles nicht erfolgreich war

    Nur was ist mit der Message ID gemeint und wie empfange ich die. Wahrscheinlich ist das euch als erfahrende Programmierer eher bekannt. :)

    //EDIT:

    Und wenn ich mir das so durchlese, stelle ich mir die Frage:
    Was soll das bedeuten:
    Objektname und Objektwert sind Pointer auf nullterminierte Strings.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Artentus“ ()

    Naja, dein Fenster hat ein Handle, zb MainForm.Handle. Das kannst du übergeben. Dann überschreibst du WndProc und checkst die Messages.

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Danke. Suche ich mal raus wie das geht.

    Und was hat nun das hier zu bedeuten:

    Noim schrieb:

    Objektname und Objektwert sind Pointer auf nullterminierte Strings.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Artentus“ ()

    Typ string. Nullterminiert heißt, dass der String mit dem CharCode \0 endet. Das brauchst du in C, weil dein Char-Array meistens größer ist als dein String, und du wissen musst wo der String endet.
    Und bitte hör mit den Zitaten auf. Ich weiß, was ich geschrieben habe. ;)

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Ok,

    aber wie soll ich das in C# umsetzen ?

    Und ich wollte eigentlich eine Consolen Anwendung schreiben, hat die auch einen Handler ?
    Ich werde dir hier nicht alles vorkauen, auch wenn du das gerne möchtest.
    Google: "C# Console Handle"
    Google: "C# null-terminated strings"
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Also kann ich im Prinzip das hier so schreiben:

    C#-Quellcode

    1. ​[DllImport("homeputer.dll")]
    2. public static extern void homeputer_GetObjIdx(int Index, String Objektname, String Objektwert);
    3. [DllImport("homeputer.dll")]
    4. public static extern void homeputer_GetObjValName(String Objektname,String Objektwert);

    Und nur wenn ich dann die Funktion ausführen will muss ich das konvertieren.

    C#-Quellcode

    1. ​var bytes = System.Text.Encoding.Unicode.GetBytes(str + "\0");

    Aber ich verstehe noch nicht den Sinn wieso ich bei GetObjValName den Objektnamen und den Wert geben muss, wenn ich den Wert erst damit herausfinden will. Also entweder habe ich einen Denkfehler oder der Ersteller der DLL.
    *4 weiter unten belehrt worden
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nikx“ ()

    Noim schrieb:

    [...] Objektname und Objektwert sind Pointer auf nullterminierte Strings.
    Pointer zeigen auf Adressen im Speicher. Wenn Du nun den Pointer inkrementierst (oder dessen Index im Indexer), um die einzelnen Chars des Strings aus dem Speicher zu lesen (*ptr[i]) bzw. (*ptr++), kann es passieren, dass Du zu weit in den Speicher einer anderen Anwendung reinliest. -> AccessViolation. Deshalb ist das \0 da ein entsprechender Indikator für Funktionen.
    Muss nat. nicht sein, aber es läuft halt auf jeden Fall dann nicht wie erwartet und Du gibst so die Länge vor.
    Aber back to the problem.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ich kapiere vor allem nicht was das soll, eine Funktion zu habe die eigentlich eine Liste zurückgeben soll, aber stattdessen eine Liste benötigt, und dann nur entweder 1 oder 0 zurück gibt. Ich meine irgendwie muss es ja gehen aber im Moment habe ich einfach keine Ahnung wie.

    Ich habe echt keine Ahnung mehr. Vielleicht hat jemand eine Idee wenn er das hier sieht:

    Visual Basic-Quellcode

    1. Private Sub GetValueByNameBT_Click()
    2. Dim Result As Long
    3. '
    4. OValue = Space(1000)
    5. Result = homeputer_GetObjValName(ONameTB.Text, OValue)
    6. AnswerTB.Text = "R:" & CStr(Result)
    7. OValueTB.Text = FilterString(OValue)
    8. End Sub



    Visual Basic-Quellcode

    1. Attribute VB_Name = "Declare"
    2. Option Explicit
    3. Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
    4. Public Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
    5. Public Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
    6. '
    7. Public Declare Function homeputer_InitDLL Lib "homeputer.dll" () As Long
    8. Public Declare Function homeputer_ChangedObjects Lib "homeputer.dll" (ByVal Liste As String) As Long
    9. Public Declare Function homeputer_ChangeCount Lib "homeputer.dll" () As Long
    10. Public Declare Function homeputer_ObjectCount Lib "homeputer.dll" () As Long
    11. Public Declare Function homeputer_SetObjValName Lib "homeputer.dll" (ByVal Objektname As String, ByVal Objektwert As String) As Long
    12. Public Declare Function homeputer_GetObjValName Lib "homeputer.dll" (ByVal Objektname As String, ByVal Objektwert As String) As Long
    13. Public Declare Function homeputer_GetObjIdx Lib "homeputer.dll" (ByVal Index As Long, ByVal Objektname As String, ByVal Objektwert As String) As Long
    14. Public Declare Function homeputer_SetWindowHandle Lib "homeputer.dll" (ByVal Handle As Long) As Long
    15. Public LibHandle As Long, Message(100) As Long
    16. Public LastBackup As Integer
    17. Public MessagePointer As Integer
    18. Public OName As String, OValue As String, LastSync As String, CIAIP As String
    19. Public LastWatchDog As String
    20. Public PhonerLogPath As String, Phoner, ChipIDFHZObjectName As String, HomaticAlarm As String
    21. Public SimCheckVar As Integer, Developmode As Integer
    22. Public TestFormLoaded As Boolean, iRTransConnected As Boolean, USBHomaticConnected As Boolean
    23. Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
    24. Public HCDisplay() As String
    25. Public Function IsDLLProcAvailable(DLLPath As String, _
    26. Optional ProcName As String) As Boolean
    27. Dim nHMod As Long
    28. nHMod = LoadLibrary(DLLPath)
    29. If nHMod Then
    30. If StrPtr(ProcName) Then
    31. IsDLLProcAvailable = CBool(GetProcAddress(nHMod, ProcName))
    32. Else
    33. IsDLLProcAvailable = True
    34. End If
    35. FreeLibrary nHMod
    36. End If
    37. End Function
    38. Public Function FilterString(StringToFilter As String) As String
    39. Dim Pos As Integer
    40. '
    41. Pos = InStr(StringToFilter, Chr(0))
    42. If Pos > 0 Then
    43. FilterString = Left(StringToFilter, Pos - 1)
    44. FilterString = Replace(FilterString, vbCrLf, "/n")
    45. End If
    46. End Function
    47. Public Function getPrintersJobs(PrinterName As String) As Long
    48. Dim myJobs As CPrinterJobs
    49. Set myJobs = New CPrinterJobs
    50. '
    51. myJobs.DeviceName = PrinterName
    52. getPrintersJobs = myJobs.count
    53. End Function
    54. Public Function SendHC(IP As String, Address As Integer, Data As Integer) As Boolean
    55. If Address = 0 Then 'ComPort (door)
    56. If Data > 0 Then
    57. SendHC = OpenDoor(Data)
    58. Else
    59. SendHC = True
    60. End If
    61. Else 'CIA
    62. If CIA2Connect(IP) = True Then
    63. If SendCIA2Socket(">>o", "A?", False) = True Then
    64. If SendCIA2Socket(Chr(Address), "D?", False) = True Then
    65. If SendCIA2Socket(Chr(Data), "OK") = True Then
    66. SendHC = True
    67. End If
    68. End If
    69. End If
    70. End If
    71. End If
    72. End Function

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Noim“ ()

    Das ist halt C-Style. Findeste auch bei WinAPI sehr oft.
    Der Parameter ist halt dann einfach eine Referenz, die gesetzt wird und zurückkommt halt, ob es geklappt hat oder nicht. Dann kann man halt z.B. bei 0 mit GetLastError den Fehler abrufen.

    An welcher Stelle genau hängst Du denn jetzt? Ist hier mobil etwas schlecht übersehbar.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    In der PDF wird beschrieben das die Funktion homeputer_ChangedObjects(Liste) eine Liste an zuletzt geänderten Objekten zurückgeben soll. Aber anscheinend muss man diese Liste als Parameter angeben. Und zurückgeben tut es auch nur Zahlen. Ich habe mal ausprobiert ein vorhandenes Objekt als String zu übergeben, indem Fall "Licht_DG". Zurück habe ich eine 1 bekommen, also Laut der PDF "Einstellung erfolgreich". Aber was bringt mir das. Falls du den Überblick verloren hast und nicht weiß von welcher PDF ich spreche, hier nochmal:
    noim.io/homeputer_DLL_Beschreibung.pdf
    Ich habe halt noch nie mit C gearbeitet, deshalb kann ich den Gedanken des Entwicklers nicht so ganz verstehen. :D
    Naja das Thread ist alt, aber ich habe heute mal wieder etwas probiert, und nun weiß ich wie homeputer_SetWindowHandle(Handle) geht. Aber das Problem ist nun, ich habe gemerkt, sobald ich den Handler auf mein Programm setzte, verliert das Original Programm (FHZConnector) die Verbindung zum Homeputer Studio. Also habe ich mir nochmal die Dokumentation angeschaut (noim.io/homeputer_DLL_Beschreibung.pdf) und dort stand das die Messages an die Messag ID 3074 gesendet werden. Hat jemand vielleicht eine Idee wie ich die Messages mit meinem Programm abfangen kann die an den FHZConnector gerichtet sind ? Ich habe dazu nichts genau im Internet gefunden.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Noim“ ()

    Mono schrieb:

    Ich nehme an der FHZConnector läuft auch auf deinem PC?
    Ja

    Mono schrieb:

    Poste mal deinen Code in WndProc mit dem du die Messages ausliesst.
    Naja, das Programm habe nicht ich geschrieben. Ich habe zwar den Source Code aber der ist nicht gerade übersichtlich geschrieben. Ich werde ihn mal suchen. Und das Programm ist in VB 6 geschriebn weshalb ich mir erstmal das Plugin für die neue Visual Studio Version runterladen muss.
    Ich habe mal im Anhang die beiden Source Datein hochgeladen die dafür verantwortlich sein sollten. Ich wollte jetzt nicht das ganze Projekt hochladen.
    Dateien