Frage

Unsere Systeme eingebettet Programmierer die Schale eines virtuellen seriellen Port-Treiber für unsere mobile Hardware entwickelt hat, und ich habe in den Verfahren gewesen Füllung es zur Arbeit zu kommen. Der Fahrer funktioniert wie erwartet, es simuliert ein COM-Port für ein USB-Gerät, das NMEA wird speit Strings (GPS-Daten).

I WM6 Typ für kurze, aber das Betriebssystem ist WM6.1, wenn es einen Unterschied macht.

Das Problem, das ich habe, ist, dass der Fahrer nicht nur nicht geladen des Gerätes auf WM6 starten. Der Fahrer wurde sowohl für CE5 und WM6 entwickelt, aber auf CE5 der Fahrer „bedeutet“ Last beim Booten, die mich zu einem WM6 Konfigurationsproblem zeigt. Es ist vielleicht erwähnenswert, an dieser Stelle, dass der Fahrer in WM6 und CE5 laden wird ActivateDevice () Methode verwendet wird, ist es das, was ich für WM6 bisher verwendet wird, einen kleinen Test-App die Treiber zu starten, so kann ich zumindest Test der Fahrer arbeitet an WM6.

Die Registrierung ist bereits mit den erforderlichen Schlüssel für die Inbetriebnahme des Treibers aufgefüllt. So soll der Fahrer ohne Probleme beim Start geladen. HKEY_LOCAL_MACHINE \ Drivers \ BuiltIn enthält einen Unterschlüssel A36D_GPS_COM, und in diesem Schlüssel enthalten ist.

DeviceArrayIndex: 0

Device: 0

Dll: A36D.dll

Flags: 0

Friendly Name: A36D GPS-COM-Port

Index: 8

Order: 3

Prefix: COM

Priorität: 0

Priorität: 256

Von dem, was ich sagen kann, gibt es im Allgemeinen zwei gemeinsame Antworten auf diese Frage, die ich bereits untersucht habe. Diese Ideen wurden von dem Embedded-Programmierer mir gegeben, aber ich recherchiert, wie sie selbst zu tun.

1) Das COM-Port bereits verwendet wird, wenn der Fahrer versucht, Last, auch wenn die COM-Port schließlich frei ist, sobald das Gerät geladen wird. Ich habe den Index-Wert in der Registrierung von zwischen 1 bis 20 und einem Neustart des Gerätes geändert, und der Fahrer wird nicht geladen, auf einen bestimmten COM-Port. Also, um zu versuchen und zu testen dieses gründlich ich ein anderes Gerät von COM9 bis COM8 bewegt habe und zog meinen Fahrer zu COM9 (die oben genannten Registrierungseinstellungen verwenden). Die anderen Gerätetreiber laden beim Start auf COM8 ganz glücklich, aber mein Gerätetreiber nicht auf COM9 booten. Ich habe sogar versucht, die anderen Einstellungen zwicken, aber noch ist es nicht die beim Booten geladen werden.

2) Eine weitere mögliche Probleme und die Differenz zwischen CE5 und WM6 ist die Sicherheit. Also mit dem MSDN-Artikel http://msdn.microsoft.com/en-us /library/bb737570.aspx ich habe gearbeitet bei der Unterzeichnung und XML-Provisioning. Mit einem privilegierten Schlüssel (nicht abgelaufen), Die A36D.dll in Visual Studio unterzeichnet und die Installation CAB-Datei erstellt wird, auch mit dem gleichen Schlüssel signiert. Eine _setup.xml Datei wird in der CAB-Datei erstellt und angehängt, so dass die signierten Schlüssel in den Zertifikatspeicher hinzugefügt wird. Die CAB-Datei signiert ist wieder mit dem gleichen Schlüssel zu gewährleisten, ist es nach wie vor gültig ist. Darüber hinaus wird die _setup.xml in seine eigene .CPF Datei verpackt. Sowohl die CAB und CPF-Dateien hinzufügen Sie den Schlüssel zu den Zertifikatspeicher „HKEY_LOCAL_MACHINE \ Comm \ Security \ System“ so weiß, dass dies funktioniert. Als eine Frage der Vorsicht habe ich es in den Privileged, Unprivileged, ROOT und SPC Zertifikatspeicher installiert. Aber der Gerätetreiber noch nicht geladen in Device.exe wenn sich das mobile Gerät bootet.

Anders als eine Umgehung einer Start-up-Anwendung, die ActivateDevice () auf dem Fahrer ruft, bin ich ratlos, wie diese Treiber zu laden beim Start-up zu erhalten.

Ich finde es sehr seltsam funktioniert es in CE5 aber nicht in WM6, ich weiß nicht nur von etwas wissen, etwas, die Probleme verursachen könnte.

Hat jemand weitere Vorschläge haben, die ausprobiert werden können.

Jede Hilfe sehr geschätzt.

War es hilfreich?

Lösung

Ich bin mehr vertraut mit Windows CE, aber hier sind ein paar Dinge:

  • Haben fügen Sie einen Debug-Druck in der DllMain-Funktion, um zu sehen, ob sie genannt wird?
  • Haben Sie eine Abhängigkeits Pause überprüfen. Könnte es sein, dass irgendwie haben Sie eine DLL unter CE verfügbar 5, die nicht dort unter WM6 ist?

Andere Tipps

Dies ist eine Antwort, aber nicht die ‚richtige‘ ein. Es ist nur eine Arbeit rund um die Lade Problem. Ich dachte, das vor mehr als eine Woche, aber wollte es nicht als die Lösung verwenden. Das ist also hoffentlich nur eine temporäre Lösung.

Der folgende Code wird verwendet, um manuell den Treiber zu laden, sein in C # geschrieben C ++ Anrufe verwenden, ich C # gewohnt bin, weshalb ich ein C # tat Projekt kein C ++ ein. Diejenigen, die C ++ verwenden, wird zweifellos schaffen dies in einer C ++ App.

public class LoadDriver
{
    [DllImport("coredll.dll", SetLastError = true)]
    public extern static IntPtr ActivateDevice(string lpszDevKey, int dwClientInfo);
    [DllImport("coredll.dll", SetLastError = true)]
    public static extern void SignalStarted( uint dw);

    public static void Main(string[] args)
    {
        Cursor.Current = Cursors.Default;
        IntPtr handle = ActivateDevice("Drivers\\BuiltIn\\A36D_GPS_COM", 0);
        if(handle != IntPtr.Zero)
        {
            Console.Write("Success");
        }

        if (args.Length > 0)
        {
            try
            {
                SignalStarted(uint.Parse(args[0]));
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

Nun, damit diese sie arbeiten muss beim Start ausgeführt werden, so dass ich in dem erforderlichen Registrierungsschlüssel hinzugefügt.

"HKEY_LOCAL_MACHINE/init"
Launch62 = A36D_loaddriver.exe
Depend62 = "32 00"

"32 00" ist es Lasten nach dem shell32.exe

, um sicherzustellen,

Nun ist die die Inbetriebnahme des Gerätes wird der Fahrer in Device.exe aktiviert.

In Bezug auf die Unterzeichnung / registry Problem wird dies sieht immer noch entscheiden kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top