none
wo muss die DLL Stehen ? RRS feed

  • Frage

  • Hi Leute,

    irgendwie findet mein Programm eine DLL nicht.

    Imports System.Runtime.InteropServices
    
    
    Public Class Form1
        <DllImport("CashDrawer.dll")> _
        Public Shared Function fnPxCashDrawerOpen(ByVal num_drawer As Short) As Boolean
        End Function
    
        Public Shared Function fnPxGetCashDrawerStatus(ByVal num_drawer As Short) As Boolean
        End Function
    
    
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Timer1.Interval = 500
        End Sub
        Private Sub Cashdrawer1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cashdrawer1.Click
            fnPxCashDrawerOpen(&H1)
            Timer1.Start()
        End Sub
    
        Private Sub Cashdrawer2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cashdrawer2.Click
            fnPxCashDrawerOpen(&H2)
            Timer1.Start()
        End Sub
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Dim Data As Boolean
            Data = fnPxGetCashDrawerStatus(&H1)
            If Data = True Then
                State1.Text = "Open"
            Else
                State1.Text = "Close"
            End If
            Data = fnPxGetCashDrawerStatus(&H2)
            If Data = True Then
                State2.Text = "Open"
            Else
                State2.Text = "Close"
            End If
        End Sub
    
    
    End Class

    bekomme dann  beim Aufruf

    Cashdrawer1_Click

    der DLL folgenden Fehler:

    Die DLL "CashDrawer.dll": Das angegebene Modul wurde nicht gefunden. ???????????

    Egal wo ich die CashDrawer.dll hin kopiere er findet sie einfach nicht !


    Visual Studio 2010 Proffessional / Microsoft Visual Basic 2010

    Mittwoch, 20. Juni 2012 10:08

Antworten

  • Also wenn es sich um eine System-DLL handlet (User32.DLL, Kernel32.DLL, Shell32.DLL, ...) sollte die unter System32 liegen. Ansonsten müsste die DLL bei deiner EXE-Datei sein. Denn dort werden Native DLL's als erstes gesucht, dann gehts zum System (System32) usw.

    Alternativ versuche mal beim Import den Vollständigen Pfad anzugeben, ob Sie denn da gefunden wird (wäre seltsam wenn nicht):

    <DllImport("C:\Meine DLLs\CashDrawer.dll")> 


    Koopakiller - http://koopakiller.ko.ohost.de/

    Mittwoch, 20. Juni 2012 11:01
    Moderator
  • Hallo Klaus,

    ich mische mich mal ein.

    Lt. DependencyWalker wird zusätzlich die multilangXML.dll referenziert, die im gleichen Verzeichnis liegen müsste. 
    Sie ist auch in Deinem Beispielprojekt auf Skydrive enthalten.

    Danach erhalte ich zwar eine Fehlermeldung, aber die DLL wird geladen.

    Gruß Elmar

    Mittwoch, 20. Juni 2012 13:31
  • Hallo Elmar,

    Also entweder bin ich zu doof (was ich explizit nicht ausschließen will ) oder die DLL ist es!

    Hab die Dateien jetzt mit ins Projekt aufgenommen und die Einstellungen so wie du es Beschreiben hast vor genommen aber das Programm bekommt trotzdem einen Fehler wenn ich den Button drücke.

    Wir haben das jetzt so gelöst das ein EXE File erstellt wird und wir in den Ordner wo dieses steht dann auch die Benötigten DLL rein Kopieren.

    Damit Funktioniert das Ganze dann auch.

    Und das alles nur weil die Touchkasse eine eigene Ansteuerung der Kassenlade hat statt wie ansonsten  üblich  diese über den Bon Drucker geregelt wird ! (grrr)

     

    Grüße Klaus


    Visual Studio 2010 Professional / Microsoft Visual Basic 2010

    Freitag, 22. Juni 2012 08:33

Alle Antworten

  • Also wenn es sich um eine System-DLL handlet (User32.DLL, Kernel32.DLL, Shell32.DLL, ...) sollte die unter System32 liegen. Ansonsten müsste die DLL bei deiner EXE-Datei sein. Denn dort werden Native DLL's als erstes gesucht, dann gehts zum System (System32) usw.

    Alternativ versuche mal beim Import den Vollständigen Pfad anzugeben, ob Sie denn da gefunden wird (wäre seltsam wenn nicht):

    <DllImport("C:\Meine DLLs\CashDrawer.dll")> 


    Koopakiller - http://koopakiller.ko.ohost.de/

    Mittwoch, 20. Juni 2012 11:01
    Moderator
  • Es handelt sich um keine System DLL

    Auch wenn ich denn Pfad komplett eingebe bekomme ich die geleiche Fehlermeldung ?

    Noch irgend eine Idee ?


    Visual Studio 2010 Proffessional / Microsoft Visual Basic 2010

    Mittwoch, 20. Juni 2012 11:11
  • Bist dir denn sicher, das die DLL die entsprechende Methode enthält? Denn wenn du sogar den kompletten Pfad angibnst, kann .NET ja nichts mehr falsch amchen.

    Koopakiller - http://koopakiller.ko.ohost.de/

    Mittwoch, 20. Juni 2012 11:15
    Moderator
  • MHH

    ist eine Fremd DLL vom Hersteller !

    Sein Testprogramm funktioniert damit !?

    Aber wenn ich mir das Projekt in mein Visual Studio 2010 laden wandelt er es auch um und das

    einzige was ich geändert habe ist

    Imports System.Runtime.InteropServices

    einzutrgagen und dann denn

     <DllImport("CashDrawer.dll")> _

    zu machen ?


    Visual Studio 2010 Proffessional / Microsoft Visual Basic 2010

    Mittwoch, 20. Juni 2012 11:22
  • Mmh, ich habs grad mal getestet und versucht die Methode XYZ aus User32.DLL aufzurufen, da erhalte ich eine EntryPointNotFoundException, daran kann es also nicht liegen.

    Bist du dir sicher das die DLL mit .NET funktioniert? (Warum auch nicht!?)
    Kannst du vielleicht mal einen Downlaod link zum BeispielProjekt und der DLL geben? Welche Programmiersprache wird in diesem Projekt verwendet?


    Koopakiller - http://koopakiller.ko.ohost.de/

    Mittwoch, 20. Juni 2012 11:32
    Moderator
  • Hier mal der Link zum "Original" Projekt

    http://sdrv.ms/KMljAM

    Diese Öffne ich mit Visual Studio 2010 VB.net und er Konvertiert es Automatisch.


    Visual Studio 2010 Professional / Microsoft Visual Basic 2010

    Mittwoch, 20. Juni 2012 12:40
  • Ok, mir fehlt jetzt natürlich noch die DLL ;) Die bräuchte ich auch noch zum Testen.

    Ansonsten, hast du mal Probiert ein eigenes Module dafür zu erstellen wie in dem Projekt:

    Module ExternAPI
        Declare Function fnPxCashDrawerOpen Lib "CashDrawer.dll" (ByVal num_drawer As Short) As Boolean
        Declare Function fnPxGetCashDrawerStatus Lib "CashDrawer.dll" (ByVal num_drawer As Short) As Boolean
    End Module

    Hier sind meine VB kenntnisse allerdings ziehmlich weit am Ende, sodas ich eigentlich keinen unterschied zwischen dieser und deiner Version sehen kann.


    Koopakiller - http://koopakiller.ko.ohost.de/

    Mittwoch, 20. Juni 2012 12:52
    Moderator
  • Hi Koopakiller,

    die dll ist mit im zip. Verzeichniss :-) (\DemoAPIVB\bin\Release)


    Visual Studio 2010 Professional / Microsoft Visual Basic 2010

    Mittwoch, 20. Juni 2012 12:59
  • Stimmt, hab ich übersehen. Ich würde mal sagen die DLL ist kaputt, bzw. da stimmt was nicht. Ich bekomme beim Ausführen eine BadImageFormatException was laut MSDN auftritt, wenn die DLL einen "Schaden" hat.

    Also, selbst in der Demo passiert das. Vielleicht ist etwas beim herunterladen der DLL schief gegangen? Ich habe es 2mal gedownloaded um desen Fehler zu vermeiden, beide male aber der Fehler. Ansonsten weiß ich auch nicht mehr weiter :(


    Koopakiller - http://koopakiller.ko.ohost.de/

    Mittwoch, 20. Juni 2012 13:15
    Moderator
  • mhh

    Hab die DLL nochmal separat Hochgeladen !

    Bitte nochmal Testen.

    Danke


    Visual Studio 2010 Professional / Microsoft Visual Basic 2010

    Mittwoch, 20. Juni 2012 13:21
  • Hallo Klaus,

    ich mische mich mal ein.

    Lt. DependencyWalker wird zusätzlich die multilangXML.dll referenziert, die im gleichen Verzeichnis liegen müsste. 
    Sie ist auch in Deinem Beispielprojekt auf Skydrive enthalten.

    Danach erhalte ich zwar eine Fehlermeldung, aber die DLL wird geladen.

    Gruß Elmar

    Mittwoch, 20. Juni 2012 13:31
  • Danke Elmar,

    es dürfen sich gerne noch mehr "Einmischen"

    Werde das gleich mal Testen.


    Visual Studio 2010 Professional / Microsoft Visual Basic 2010

    Mittwoch, 20. Juni 2012 13:33
  • Auch mit dieser Version klappt es nicht...

    Aber ich habe mal die EXE ohne Debuggen gestartet, da kam diese Meldung:

    Im Grunde genau das selbe, aber würde der Fehler von einem .NET Teil ausgelöst werden, so würde das Programm einfach abstürtzen (Meldung: Programm funktioniert nicht mehr   -   es wird nach eine Lösung gesucht), so sieht es aus, als ob in der DLL etwas nicht gefunden wurde.

    Ansonsten fand ich zu dem HRESULT heraus das es darum geht eine 32Bit Assembly in ein 64Bit Programm zu laden. Nachdem ich das Projekt von AnyCPU auf x86 stellte kam dann eine DllNotFoundExeption. Das sagte mir dann auch der HRESULT 0x8007007E.

    Diese Meldung kam auch dann, nachdem ich alle Dateien aus dem Release-Ordner in den Debug-Ordner kopierte.


    Koopakiller - http://koopakiller.ko.ohost.de/

    Mittwoch, 20. Juni 2012 13:40
    Moderator
  • So

    hab jetzt auch mal die multilangXML.dll "bereit gestellt "

    jetzt wird anscheinend die DLL geladen aber folgende Fehlermeldung kommt

    AccesViolatonException Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.

    Was bedeutet ds jetzt  ??


    Visual Studio 2010 Professional / Microsoft Visual Basic 2010

    Mittwoch, 20. Juni 2012 14:00
  • Hallo Klaus,

    in den meisten Fällen bedeutet das: Miserabel programmiert ;-(

    hier komme ich nur bis zu einer Fehlermeldung, dass eine ...sys fehlt,
    was wohl an der fehlenden Kasse liegen dürfte.

    Vermutlich musst Du die initial.xml mit ins Verzeichnis legen,
    wobei die einige "Macken" hat, wie "falsche Kommentare" und Zeichensalat, z. B.:

    ;Action Max=20 Id Number ɬ47

    (und andere mehr)
    Aber mit der Datei mag die Dll funktionieren.

    Gruß Elmar

    Mittwoch, 20. Juni 2012 16:49
  • Hallo Elmar,

    wenn ich den Programmierer mal sehe sag ich ihm bescheid ;-)

    Ok

    Installation auf der "Richtigen" Kasse gemacht und die initial.xml ohne Macken genommen und siehe da TATA

    Die Kassenlade öffnet sich :-)

    Warum die doofe initial.xm beim kopiern ne Macke bekommen hat wissen die Götter oder MS.

    So jetzt muss ich nur noch Visual Studio sagen das er die initial.xml und die multilangXML.dll  nach dem Installiern auch von alleine findet !?

    ABER WIE ?

    Grüße Klaus


    Visual Studio 2010 Professional / Microsoft Visual Basic 2010


    • Bearbeitet WPF_Klaus Donnerstag, 21. Juni 2012 10:53
    Donnerstag, 21. Juni 2012 09:08
  • Was ist da das Problem? Du fügst Sie einfach deinem Setup hinzu und installierst Sie im selben Ordner wie die CashDrawer.DLL und deine EXE-Datei.

    Koopakiller - http://koopakiller.ko.ohost.de/

    Donnerstag, 21. Juni 2012 13:45
    Moderator
  • Das Problem ist das ich beim Installieren nicht weis wo denn mein Programm gespeichert wird!

    Wenn ich mein Projekt in Visual Studio "Veröffentliche" dann bekomme ich ja folgendes

    wenn ich das Setup dann auf dem PC laufen lassen "Installiert" Windows das Programm "irgenwo" hin und ich kann meine beiden  Dateien dort nicht hinkopieren!

    und unter system/sytem32 findet er sie auch nicht.


    Visual Studio 2010 Professional / Microsoft Visual Basic 2010

    Donnerstag, 21. Juni 2012 13:56
  • Hallo Klaus,

    wenn Du mit ClickOnce veröffentlichst, so nimm die beiden DLLs und die Xml-Datei in das Projekt auf.
    Für den Build-Vorgang wähle die Einstellung Ins Ausgabeverzeichnis kopieren mit Immer wenn neuer.

    Unter Veröffentlichen kannst Du über die Schaltfläche "Anwendungsdateien" festlegen,
    welche Dateien eingeschlossen und installiert werden.

    Gruß Elmar

    Donnerstag, 21. Juni 2012 18:44
  • Hallo Elmar,

    Also entweder bin ich zu doof (was ich explizit nicht ausschließen will ) oder die DLL ist es!

    Hab die Dateien jetzt mit ins Projekt aufgenommen und die Einstellungen so wie du es Beschreiben hast vor genommen aber das Programm bekommt trotzdem einen Fehler wenn ich den Button drücke.

    Wir haben das jetzt so gelöst das ein EXE File erstellt wird und wir in den Ordner wo dieses steht dann auch die Benötigten DLL rein Kopieren.

    Damit Funktioniert das Ganze dann auch.

    Und das alles nur weil die Touchkasse eine eigene Ansteuerung der Kassenlade hat statt wie ansonsten  üblich  diese über den Bon Drucker geregelt wird ! (grrr)

     

    Grüße Klaus


    Visual Studio 2010 Professional / Microsoft Visual Basic 2010

    Freitag, 22. Juni 2012 08:33