www.mikrocontroller.net

Forum: PC-Programmierung Windows Message für COM/USB aktivität in VB


Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Meine Aufgabe umfasst 2 Geräte, eines sendet per USB eines per COM Port.
Wenn die Geräte senden muss ich etwas tun.
Ich brauche also eine Windowsmessage, die ich mit VB abfangen kann.

Wer hat damit Erfahrung und kann mir Anhaltspunkte liefern?

Grüße, Johannes

Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So weit so gut.

Bisher denke ich über zwei varianten nach:

a) mit einem MAPI Hook die WM_Devicechange abfangen und mit 
DBT_Devicespecific oder DBT_Userdefined ein senden der seriellen 
Schnittstelle feststellen.

b) mit einen eigenen Task dauer abfragen und ... z.B. eine Funktion in 
einem anderen VBA-Task ausführen, Variablen an andere Tasks übergeben 
oder eine eigene WM abschicken.

Bei beiden Varianten stehe ich vor dem Problem dass ich damit nie etwas 
zu tun hatte.

Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, ich habe mich für die multithread variante entschieden.
Ich habe code geschrieben, aber immer noch Probleme damit.

Der testcode ist ohne serielle schnittstelle.
Es geht nur darum mit parallelen Tasks in eine textbox zu schreiben.
Option Explicit

'**********************************************************************************
'* Kernel32 Declares                                                              *
'**********************************************************************************
Public Declare Function CloseHandle Lib "kernel32" _
    (ByVal lpHandle As Long) _
As Long

Public Declare Function CreateThread Lib "kernel32" _
        (ByVal lpThreadAttributes As Any, _
        ByVal dwStackSize As Long, _
        ByVal lpStartAddress As Long, _
        ByVal lParameter As Long, _
        ByVal dwCreationFlags As Long, _
        ByVal lpThreadID As Long) _
As Long

'**********************************************************************************
'* Functionen and Subs                                                             '*
'**********************************************************************************

Private Sub Doomsdaydevice_Click()
    Dim threadhandle As Long
    Dim i As Long
    
    MultiBox.Text = ""
    
    For i = 1 To Round(((Rnd * 10) + 1), 0)
        threadhandle = CreateThread(ByVal 0&, 2000, AddressOf thiswillbethepowerthread, ByVal 0&, ByVal 0, ByVal 0&)
        CloseHandle (threadhandle)
    Next i   
End Sub

Sub thiswillbethepowerthread() 'Der Multithread
    Dim i As Integer
    For i = 1 To Round(((Rnd * 10) + 1), 0)
        Tabelle1.MultiBox.Text = Tabelle1.MultiBox.Text + Str(i)
    Next i
End Sub

Probleme macht diese Zeile:
Tabelle1.MultiBox.Text = Tabelle1.MultiBox.Text + Str(i)
Mit der Zeile erscheint der Error 7 Nicht genug speicher
Löscht man sie, läuft der Programmcode problemlos ab.
Ersetzt man sie mit
MsgBox("Tadaa")
so werden alle Threads gestartet, stürzen aber nach ein paar 
weggeklickten MsgBoxen ab, und nehmen das Programm mit sich.

Meine Frage: Was ist los?

Danke, Johannes

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine WindowsAPI funktion einfach die Adresse einer internen! Basic Sub 
zu geben, auf die Idee muß man erst mal kommen. Wo hast du das her?
Ich finde es interessant das das überhaupt geht. Probleme bekommst du 
weil du aus einem anderen Thread völlig unkontrolliert einfach auf 
Elemente zugreifst die dir nicht gehören und du niemand anders davon 
informierst. Deswegen kracht es irgendwann. Sollte es VB6 sein , VB6 
unterstützt nur Singlethreadapartments. Nimm VB. Net und nutze die 
Threadunterstützung des Frameworks.

Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mich ein bisschen eingelesen und das war meine erste Schätzung.
Leider bin ich an VBA gebunden.

Ich habe etwas von Appartments und Marshalling gelesen, aber noch nicht 
wirklich Ahnung davon.

Kann ich meinen Absturz verhindern wenn ich Events werfe?
Wie funktioniert das mit Events werfen?

Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Übergaben per Event, wie funktionieren die?

Ich habe jetzt ein Klassenmodul namens multiclass
Public Event SendString(ByVal MessageString As String)
Public Sub pseudoget()
    Dim thisstring As String
    thisstring = "Waaaaa"
    RaiseEvent SendString(thisstring)
End Sub

In einem Modul habe ich dann folgendes formuliert:
Public WithEvents EVENTMESSAGE As multiclass

Private Sub Doomsdaydevice_Click()
    Dim mymultiobject As multiclass
    Set mymultiobject = New multiclass
    mymultiobject.pseudoget
End Sub
    
    
Sub EVENTMESSAGE_SendString(ByVal MessageString As String)
    MsgBox(MessageString)
End Sub

Die Zeiele
Public WithEvents EVENTMESSAGE As multiclass
führt zu einem Compilerfehler.

Und ich glaube auch die Zeile
Sub EVENTMESSAGE_SendString(ByVal MessageString As String)
    MsgBox(MessageString)
End Sub
macht so noch keinen Sinn.

Insbesondere fehlt auch irgendwo noch ein
SET EVENTMESSAGE 

Kann jemand meine Verwirrung auflösen?

Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, Nachrichten Werfen geht jetzt:
multiclass-Objekt
Public Event SendString(ByVal MessageString As String)
Public Sub pseudoget()
    Dim thisstring As String
    thisstring = "Waaaaa"
    RaiseEvent SendString(thisstring)
End Sub

Hauptteil
Dim WithEvents mymultiobject As multiclass
Private Sub Doomsdaydevice_Click()
    Set mymultiobject = New multiclass
    mymultiobject.pseudoget
'    Dim i As Long
'    For i = 1 To Round(((Rnd * 3) + 1), 0)
'        threadhandle = CreateThread(ByVal 0&, 2000, AddressOf mymultiobject, ByVal 0&, ByVal 0, ByVal 0&)
'        CloseHandle (threadhandle)
'    Next i
'    MsgBox ("Ende: " + Str(i) + " threads wurden erstellt")
    MsgBox ("waiting")
End Sub
    
Sub mymultiobject_SendString(ByVal MessageString As String)
    MsgBox (MessageString)
End Sub

Jetzt habe ich nur noch ein Problem das mymultiobject als eigenen thread 
starten zu lassen. Der Auskommentierte Teil ist mein Gedanke, der 
allerdings nicht zum Ziel führt. Unzulässige verwendung von AdressOf.

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
VBA == Visual Basic for Applications
Schreibst du das in Excel/Word ???

Hast du irgendwo die Aussage gefunden, daß VBA threadsicher ist???
Warum versuchst du das so riskant zu gestalten? Ich sage nicht das es 
nicht geht, aber ich weiß, das es nicht immer gehen wird und dann kracht 
es gewaltig.
Mach das mit eigenen ActiveX Objekten und vergiß dieses Createthread.
http://www.freevbcode.com/ShowCode.Asp?ID=1287 <- lies dir das mal durch

>Meine Aufgabe umfasst 2 Geräte, eines sendet per USB eines per COM Port.
>Wenn die Geräte senden muss ich etwas tun.
Da würde ich mir 2 ActiveX Objekte schreiben, die den Empfang und die 
Protokollauswertung machen und per Event an das Hauptprogramm bescheid 
sagen.
Die ActiveX Objekte kannst du in VB.Net schreiben. Nicht vergessen die 
COM-Sichtbarkeit anzuschalten. Da hast du vollen Threadsupport, wenn es 
überhaupt nötig ist. Vieles geht mit Timer. Die Objekte registrieren und 
in VBA einbinden.


Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Übrigens:
>threadhandle = CreateThread(ByVal 0&, 2000, AddressOf mymultiobject, ByVal >0&, 
ByVal 0, ByVal 0&)
Createthread erwartet die Adresse einer Funktion nicht eines Objekts. 
Sei froh  das deine Programmiersprache dich hindert sowas auszuführen. 
Daten lassen sich auch als Programmcode interpretieren. Da die Adresse 
deinem Programm gehört wird Windows ihn auch nicht davon abhalten.

Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Grund warum ich das möchte ist folgender: Ich muss eine Art OnCOM 
Event benutzen.

Verwenden darf ich alles was in VBA-ExCel 6.0 zur Verfügung steht.
Meine Überlegung war einen Thread laufen zu lassen, der das Event 
generiert.

VBA threadsicher -> Nein, diese Aussage habe ich nicht gefunden. Aber 
mein Thread soll als einziger auf den InBuffer zugreifen, und verschickt 
gegebenenfalls ein Event. Da sollten keine Konflikte auftreten. Übersehe 
ich da etwas?

ActiveX -> Welche Objekte stehen mir standardmäßig zur Verfügung? Ich 
kenne mich damit nicht so wirklich aus. Wie ich das sehe müsste ich eine 
EXE kompilieren, und diese beifügen. Diese Option steht mir nicht zur 
Verfügung. Anforderung ist: Alles in einer Datei.

Vieles geht mit Timer -> Davon habe ich gelesen, aber mich noch nicht 
beschäftigt. Da der Eingabepuffer ja ein Puffer ist, könnte ich auf 
Echtzeit vermutlich verzichten. Ich habe ca. 8 byte Puffergröße, da 
könnte ich vermutlich auch sequentiell ran.

VB.NET -> Steht mir leider nicht zur Verfügung.

Wenn es absolut nicht geht, kann ich eventuell nochmal verhandeln. Wäre 
aber eher schlecht für mich.

http://www.freevbcode.com/ShowCode.Asp?ID=1287
-> Dies habe ich bereits gelesen, ich lese es jetzt nochmal.
Ich glaube ich bin nicht erfahren genug um das gesamte modell auf einmal 
zu verstehen.
Aus verschiedenen Quellen habe ich bereits herausgefunden, dass:
-Ich ein MTA möchte
-Ich zuerst CoInitialise(Ex) ausführen muss
-(L)RCP wichtig sein könnte
-COINIT der Appartmenttyp its, und ich den Typ Coinit_Multithreaded 
möchte

Ich glaube dass ich das ganze insgesamt allerdings noch nicht verstanden 
habe.

Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte durch dieses neue Post mein vorheriges nicht als unwichtig 
erklären, deshalb seht dieses bitte als Fortsetzung des vorherigen.

Seit dem erstenmal lesen von
http://www.freevbcode.com/ShowCode.Asp?ID=1287
bin ich wohl schon ein bisschen tiefer in der Materie, und habe 
tatsächlich mehr verstanden.

Mir brennen Fragen auf den Lippen, die wichtigste ist:
-wofür brauche ich hier im speziellen die GUID?

Grüße, und Dank im Vorraus

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ActiveX -> Welche Objekte stehen mir standardmäßig zur Verfügung? Ich
>kenne mich damit nicht so wirklich aus. Wie ich das sehe müsste ich eine
>EXE kompilieren, und diese beifügen. Diese Option steht mir nicht zur
>Verfügung. Anforderung ist: Alles in einer Datei.

So wie ich dich verstehe benutzt du excel. Das wird also mit sicherheit 
keine EXE netstehen. Du beantwortest die wichtigste Frage nicht. Hast du 
2 serielle Schnittstellen? Ist das USB-Gerät auch eine virtuelle 
serielle Schnittstelle?
Wenn ja, benutze MSCOMM das ist als COM-Object bei VB6 dabei und in der 
VB Runtime redistributable enthalten. Das wird auf dem Rechner 
installiert und dann kann es auch deine Excelapplikation benutzen. Es 
generiert auch OnCOM Events. Damit läßt sich das ganze Threadzeug 
umgehen.

Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ich benutze ExCel.
Ja, ich habe 2 Serielle schnittstellen. Eine der beiden ist Virtuell 
(USB)
Randnotiz, die USB-Entscheidung ist erst kürzlich gefallen.

Eine MSCOMM Lizenz liegt nicht vor. MSCOMM muss umgangen werden - 
deshalb der Terz mit den Threads.

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MSCOMM ist frei verfügbar in der VB Runtime Redistributable.
Die kannst du bei Microsoft runterladen

Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, mittlerweile stürzt mein Mutlithread nicht mehr ab.
Alles was man beachten muss ist dass sich die threads vor dem 
Hauptprogramm beenden.

Wenn ich das ganze jetzt noch auf Messages erweitere, sollte ich 
glücklich sein.
Leider kann ich Messages nur in einem Klassenmodul deklarieren, wodurch 
ich brobleme bekomme, wenn ich "AddressOf Objekt" verwenden will.

Ich möchte ja nicht uneinsichtig wirken, aber ich sehe keine andere 
Möglichkeit für mich.

in einem Modul:
Public Sub thiswillbethepowerthread() 'Der Multithread
    Call CoInitialize(0)
    Dim i As Integer
    For i = 1 To Round(((Rnd * 3) + 1), 0)
        MsgBox ("tada")
    Next i
    Call CoUninitialize
End Sub

im Hauptteil
Public Declare Function CloseHandle Lib "kernel32" _
    (ByVal lpHandle As Long) _
As Long
Public Declare Function CreateThread Lib "kernel32" _
        (ByVal lpThreadAttributes As Any, _
        ByVal dwStackSize As Long, _
        ByVal lpStartAddress As Long, _
        ByVal lParameter As Long, _
        ByVal dwCreationFlags As Long, _
        ByVal lpThreadID As Long) _
As Long
Declare Function CoInitialize Lib "ole32.dll" _
    (ByVal pvReserved As Long) _
As Long
Declare Sub CoUninitialize Lib "ole32.dll" ()

Private Sub Doomsdaydevice_Click()
    Dim threadhandle As Long
    Dim i As Long
    MultiBox.Text = ""
    For i = 1 To Round(((Rnd * 3) + 1), 0)
        threadhandle = CreateThread(ByVal 0&, 2000, AddressOf thiswillbethepowerthread, ByVal 0&, ByVal 0, ByVal 0&)
        CloseHandle (threadhandle)
    Next i
    MsgBox ("Pause here" + vbNewLine + "Counter is: " + Str(i - 1))
End Sub


Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MSCOMM ist frei verfügbar -> hatte ich überlesen.

Also gut, dann seh ichs mir nochmal an :)

Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK. die MSCOMM scheint die richtige Wahl für mich zu sein.

Wie kann ich sie einbinden ohne:
-Das Objekt in eine Form zu setzen.
-Eine Lizenz auf jedem Rechner installieren zu müssen.

Am Ende hätte ich gerne alle Dateien in einem Verzeichnid, darum wäre es 
schön wenn ich nicht auf das Windowsverzeichnis zurückgreifen müsste.

Grüße, Johannes

P.S. Ist es angebracht einen neuen thread zu starten?

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wie kann ich sie einbinden ohne:
>-Das Objekt in eine Form zu setzen.
Das sind VB Grundlagen, lies dir das in einem Buch durch.

>Eine Lizenz auf jedem Rechner installieren zu müssen.
Wieso Lizenz, das einzige was du machen mußt ist die dll mitzuliefern 
und auf dem Rechner zu registrieren (mit regsvr32).

Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Wie kann ich sie einbinden ohne:
>>-Das Objekt in eine Form zu setzen.
>Das sind VB Grundlagen, lies dir das in einem Buch durch.

Ich mache fast nichts anderes als mich in vb einzuarbeiten.
-Wäre es in einer DLL, dann könnte ich mit DECLARE... arbeiten.
-Wäre es in einer CTL, dann könnte ich evtl mit CreateObject... arbeiten
-Diese Methode: 
http://www.the-starbearer.de/Praxis/ElektronikamPC... 
möchte ich nicht verwenden. Der benutzer muss dann auf jedem weiteren 
Rechner diverse schritte unternehmen.

>>Eine Lizenz auf jedem Rechner installieren zu müssen.
>Wieso Lizenz, das einzige was du machen mußt ist die dll mitzuliefern
>und auf dem Rechner zu registrieren (mit regsvr32).

MSCOMM braucht eine Lizenz um auf dem jeweiligem Rechner zu laufen. Das 
ist im Grunde nur ein Registry eintrag. Auf VB.NET kann man etwas in 
Richtung:
object = "{648A5603-2C6E-101B-82B6-000000000014}#1.1#0"; "MSCOMM32.OCX"
schreiben um sich den Terz zu sparen.

Probleme in der Anwendung wird alles bereiten was der User tun muss.
Ein Objekt ins ExCel Sheet zu platzieren kommt bei Dieser Anwendung 
leider nicht in Frage.
Die Anforderung an den User soll sein: "Kopiere diesen Ordner auf den 
Computer Deiner Wahl und mache einen Doppelklick auf die ExCel-datei."

Ich glaube nicht, dass das registrieren einer Lizenz und das erstellen 
eines Objekts aus einer OCX wirklich zu den Grundlagen gehrört, gerade 
weil die OnCom Events genutzt werden müssen.
Klar bleib ich dran, ich habe noch bis mitte Juni Zeit :)

Autor: Olaf Stieleke (olaf2001)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tip: Online-Hilfe nach "Controls dynamisch erstellen" absuchen. Da müßte 
dann beschrieben sein, wie man das macht. Ich bin zu lange raus aus VB, 
ich habs vergessen :(

OT: Kuriboh ist aber ein sehr schwaches Monster... ;-)

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß nicht was du liest, ich vermute hauptsächlich Internet 
Tutorials.
Zum einen sind die wesentlich fehlerhafter und meist sehr speziell.
Das Problem dabei wenn man mehr als Copy und Paste machen will, hat man 
ein Problem weil man es nicht begreift.
Du scheinst noch dazu irgendwas zu lesen was die Angelegenheit 
wesentlich komplizierter darstellt als sie ist. Deshalb der Tip lies ein 
Buch.

Bitte sprich nicht mehr von Lizenz sondern von Objekt oder Control.
Der eigenliche Witz ist du erwähnst sogar die Lösung zum dynamischen 
Erzeugen von Objekten (CreateObjekt) anscheinend fehlt dir da aber 
Wissen.( deshalb Buch)

Das Control muß nicht unbedingt registriert werden, es wird aber 
problemloser wenn es registriert ist.
Dein Doppelclickwunsch wird nichts, da in den meisten Fällen die 
Sicherheitseinstellungen von Excel das verhindern werden.

Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>"Controls dynamisch erstellen"
Alles was mit kompilieren zu tun hat darf ich nicht.

>ich vermute hauptsächlich Internet Tutorials
Richtig. Ich habe gehofft meine c++ kenntnisse würden mir über das 
gröbste hinweg helfen.
Ein Buch habe ich dann doch noch: Excel VBA von Monika Weber. Dieses 
Buch ist allerdings für meine Zwecke eher enttäuschend.

>Deshalb der Tip lies ein Buch.
Ich geh zur Bib. Hast Du einen Buchtipp?

>Lizenz sondern von Objekt oder Control
Windows spricht von Lizenz. Wenn man das MSCOMM Objekt einbindet, und 
dann die Module exportiert erhäkt man einen Lizenz Fehler.

>Dein Doppelclickwunsch wird nichts, da in den meisten Fällen die 
Sicherheitseinstellungen von Excel das verhindern werden.
Schwerer schlag für mich, aber auch ein leichter Hoffnungsschimmer - in 
den meisten Fällen.

>OT: Kuriboh ist aber ein sehr schwaches Monster... ;-)
OT: Englisches understatement

Autor: Olaf Stieleke (olaf2001)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes H. wrote:
>>"Controls dynamisch erstellen"
> Alles was mit kompilieren zu tun hat darf ich nicht.
>

Hat es nicht, also darfst du das ;). "Dynamisch erstellen" bedeutet "zur 
Laufzeit erzeugen" - und dementsprechend es auch wieder zur Laufzeit 
zerstören, wenn man es nicht mehr benötigt. Dafür braucht man keinen 
Compiler, das geht auch mit Interpretern wie Excel-VBA.

CreateObject heißt der Befehl übrigens...

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Richtig. Ich habe gehofft meine c++ kenntnisse würden mir über das
>gröbste hinweg helfen.
Das erklärt endlich warum du das so "umständlich" versuchst.
In C++ mußt du dich um "alles" kümmern (auch um Sachen die dich 
eigentlich bei der Lösung deines Problems gar nicht interessieren). In 
VB mußt du das nicht.
Denke Eventbasiert, entwerfe das ganze als Statusengine und schreibe es 
einfach hin.
Wenn du in C++ schonmal mit COM zu tun hattest, sollte das alles kein 
Problem sein.

Buchtip?:
Im Moment keinen, mir haben meine VB Kenntnisse gereicht MSDN und ein 
kleines Büchlein zu VBA um bei den Objekten Ahnung zu haben was geht und 
Suchbegriffe für die MSDN.
Ich kenne zwar dein Buch nicht, aber nach meiner Meinung sollte es 
vollkommen ausreichend sein, sonnst nimm noch irgendein VB-Buch das über 
das ziehen von Bunten Bilder in Forms hinausgeht.


>erhäkt
Was ist das?

Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Denke Eventbasiert, entwerfe das ganze als Statusengine und schreibe es
einfach hin.
Ich fürchte hierfür bin ich nicht gut genug

>Das erklärt endlich warum du das so "umständlich" versuchst.
Ich habe schon gemerkt dass VB mir nicht so liegt wie die c Familie.

>Buchtip?:
Ich habe mir jetzt ein VB6 Buch geholt. VB 6 Kompendium von Markt und 
technik. Ein sehr angenehmes Buch. Im wesentlichen werde ich von diesem 
Buch bestätigt.

1.MSCOMM32.ocx nach System32 kopieren
2.mit regsvr32 die Klassen registrieren
3.den Lizenzschlüssel in die Registry eintragen
4.Klasse verwenden
Private Declare Function GetSystemDirectory Lib "kernel32" Alias _
 "GetSystemDirectoryA" (ByVal lpBuffer As String, _
 ByVal nSize As Long) As Long

Private Sub TheGoButton_Click()
    Dim SysDir_API As String * 261
    Dim SysDir, OCXPath, Destpath, m As String
    Dim switch As Boolean

    Call GetSystemDirectory(SysDir_API, 260)
    Call MsgError("GetSystemDirectory", GetLastError())
    OCXPath = DieseArbeitsmappe.Path & "\" & "MSCOMM32.OCX"
    SysDir = ""
    switch = False

'*********** String nachbearbeitung **************
    Do
        m = Left(SysDir_API, 1)
        If (m >= Chr(32) And m <= Chr(126) _
            And Not (False)) _
        Then
            SysDir = SysDir + m
            SysDir_API = Right(SysDir_API, Len(SysDir_API) - 1)
        Else
            switch = True
        End If
    Loop Until (switch)
'****************************************************

    Destpath = SysDir & "\MSCOMM32.OCX"

    FileCopy OCXPath, Destpath
    Call Shell("regsvr32 " & SysDir & "\MSCOMM32.OCX", vbNormalFocus)

'    Dim MSComm1 As Object
'    Set MSComm1 = CreateObject("MSCOMM32.OCX")

End Sub

Was hier nun noch fehlt:
-TRY-Block um das copy herum
-regsvr32 auf silent umstellen
-Lizenzschlüssel eintragen
-Klasse verwenden

Ich denke mein CreateObjekt Aufruf ist falsch, weil er sich nicht nch 
den Klassen in der registry richtet.
Zunächst arbeite ich aber noch am sauberen registrieren in der Registry.




OT: erhäkt ist erhält, wenn man beim 10-Fingern daneben greift und es 
nicht merkt :)

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>3.den Lizenzschlüssel in die Registry eintragen
das macht regsvr32

>4.Klasse verwenden
Nein, sauber ist klasse erstellen und kontrollieren ob sie erstellt 
werden konnte, DANN erst verwenden


Netter Quellcode den du da postest
ist der von 1996 oder von "lernunwilligen" ?
Und jetzt mal etwas realer:
seit winnt (1996?) gibt es Rechte und Beschränkungen aus gutem Grund
1. regsvr32 kann normalerweise (spätestens ab win2000) nur der 
Administrator zur Registrierung eines Objektes benutzen
2. Eine normale exceldatei mit Macros (nichts anderes ist dein Code) 
sollte vom Administrator nicht ausgeführt werden, sondern nur von 
Nutzern mit eingeschränkten Rechten.
3. Ein normaler Nutzer sollte nicht einfach etwas nach System32 kopieren

Das sind Sicherheitskonzepte die ihre Berechtigung haben und auch nicht 
umgangen werden sollten! Ein Nutzer der diese Konzepte aufhebt wegen 
eines Excelmakros....





Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>3.den Lizenzschlüssel in die Registry eintragen das macht regsvr32
Ach, das geht auch? Ich kann damir nur die Klase eintragen.
HKEY_CLASSES_ROOT\Licenses\ erfolgt kein Eintrag

>>4.Klasse verwenden
>Nein, sauber ist klasse erstellen und kontrollieren ob sie erstellt werden 
konnte, DANN erst verwenden
Ich hatte nur abgekürzt, weil die klasse noch Zukunftsmusik ist.

>Netter Quellcode den du da postest ist der von 1996 oder von >"lernunwilligen" ?
Er ist von mir, die Buchtitel sind mir nicht bekannt.

>Und jetzt mal etwas realer:
>seit winnt (1996?) gibt es Rechte und Beschränkungen aus gutem Grund
>1. regsvr32 kann normalerweise (spätestens ab win2000) nur der
>Administrator zur Registrierung eines Objektes benutzen
>2. Eine normale exceldatei mit Macros (nichts anderes ist dein Code)
>sollte vom Administrator nicht ausgeführt werden, sondern nur von
>Nutzern mit eingeschränkten Rechten.
>3. Ein normaler Nutzer sollte nicht einfach etwas nach System32 kopieren
>Das sind Sicherheitskonzepte die ihre Berechtigung haben und auch nicht
>umgangen werden sollten! Ein Nutzer der diese Konzepte aufhebt wegen
>eines Excelmakros....
Es handelt sich um Laborrechner, die vom Firmennetzwerk geschützt 
werden. Sie laufen im Admin-Mode, soweit ich das beurteilen kann. Ich 
werde das nochmals überprüfen.
Das Konzept ist fehlerhaft wenn es mich im Ausüben meiner tätigkeit 
behindert. Was nutzt mir eine Programmiersprache in der ihc nicht 
programmieren darf? Am liebsten würde ich nicht mit der Registry 
hantieren, oder etwas in System32 kopieren. Aber mir bleibt keine andere 
Wahl - meine Arbeit unterliegt einschränkungen die ich nicht ändern 
kann. Das Threading modell wäre eine Tolle möglichkeit gewesen, aber 
offensichtlich kann man es nciht verwenden. Ich MUSS mit der MSCOMM.OCX 
arbeiten, leider macht diese es erforderlich einträge in der Registry zu 
tätigen. MSCOMM ist nicht überall installiert, und jeder DAU muss mit 
einem Doppelklick das Programm zum laufen bringen. Noch viel schlimmer, 
jeder DAU soll es auf eine Diskette kopieren können und es an einen 
anderen Rechner schleppen, wo er es auch mit einem Doppelklick verwenden 
kann, ohne zusätzlichen Aufwand - zu dem ein IT-Support nötig wäre.

Gerne mache ich es anders. Aber derzeit sehe ich nur 2 Möglichkeiten:
A) Threading zum laufen bringen
B) MSCOMM zur Laufzeit registrieren

Ich möchte wirklich nicht als lernunwillig erscheinen, ohne heute sitze 
ich an dem Problem bereits 127 Stunden. Glaub mir, wenn ich einen 
bequemen Weg sehen würde, ich wäre sofort dabei.

Autor: Olaf Stieleke (olaf2001)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn das so ist...

Wenn das CreateObject fehlschlägt, dann das OCX in das 
Arbeitsmappenverzeichnis kopieren (niemals nach System32) und ein 
ShellExecute auf ne Stapeldatei ausführen. In der Stapeldatei steht drin 
"regsvr32 mscomm.ocx".

Dann blitzt ein einziges mal (wenn OCX unregged) kurz ein DOS-Fenster 
auf und das wars. In die Registry wird zum einen der Pfad des OCX 
vermerkt, zum anderen wird beim Registrieren nicht nur ein Eintrag 
erstellt - es sind derer etliche.

Der CreateObject-Aufruf erwartet eine Zeichenfolge a la 
"BarControl.GDSControl.1".

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ach, das geht auch? Ich kann damir nur die Klase eintragen.
>HKEY_CLASSES_ROOT\Licenses\ erfolgt kein Eintrag
nein höchstwahrscheinlich nicht

>Das Konzept ist fehlerhaft wenn es mich im Ausüben meiner tätigkeit
>behindert. Was nutzt m....
Ich kenne die Problematik aus dem Support im Uni-Bereich.
Ich kann dazu nur sagen, ich hoffe ihr habt einen kompetenten Admin und 
der bekommt mit was ihr da treibt. Mit sowas gefährdet man nicht nur 
1.den eigenen Rechner sondern auch 2. alle anderen Rechner. und 2. ist 
nicht akzeptabel.
Ich möchte das nicht mit dir ausdiskutieren (dazu ist dein Admin da) ich 
weise dich nur darauf hin, das du bei heutigen normalen 
Sicherheitseinstellungen in Probleme rennst.

Zum Konzept: Zur Registrierung ist ein Installationsprogramm da.(kann 
auch eine Batch datei sein)


>an dem Problem bereits 127 Stunden
???
Was hast du in den 127 Stunden getan? Ohne dich beleidigen zu wollen:
Du postest hier Code wo du mit VB-Systemprogrammierung spielst auf einem 
extremen Niveau. Ich habe schon in C++ COM-Server geschrieben und in VB 
auch schon einiges gemacht. Ich muß ehrlich sagen, sowas würde ich in VB 
nicht tun, weil ich mir da nicht sicher wäre ob das stabil 
geht(Createthread API aufruf und Konsequenzen).
MSCOMM ist dazu da, das du das was du machen willst in 2-5 Stunden 
hinzauberst.
Ich hätte erwartet als nächstes ein Einbinden von 2 MSCOMM-Objekten zu 
sehen mit ein paar Event-Routinen. Stattdessen kurvst du irgendwo in den 
Abgründen der COM Registrierung rum.
Hier nochmals der Rat:
Mal dir eine Statemachine auf die von Events abhängt und schreib das 
einfach in VB runter. Das ist nicht so kompliziert wie in C++.
Da wo du jetzt rumkurvst, das wird dir von VB z. T. abgenommen oder es 
wird erst interessant wenn du das Programm fertig hast und es 
weitergeben möchtest.


Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn das CreateObject fehlschlägt, dann das OCX in das
> Arbeitsmappenverzeichnis kopieren (niemals nach System32) ...
Warum nicht nach System32?

>Der CreateObject-Aufruf erwartet eine Zeichenfolge a la
>"BarControl.GDSControl.1".
Dachte ich mir, mach ich dann auch so. Thx.

>>Ach, das geht auch? Ich kann damir nur die Klase eintragen.
>>HKEY_CLASSES_ROOT\Licenses\ erfolgt kein Eintrag
>nein höchstwahrscheinlich nicht
Dachte ich mir. Ich mache es jetzt über einen silent call von regedit.

>>Das Konzept ist fehlerhaft wenn es mich im Ausüben meiner tätigkeit
>>behindert. Was nutzt m....
>Ich kenne die Problematik aus dem Support im Uni-Bereich.
>Ich kann dazu nur sagen, ich hoffe ihr habt einen kompetenten Admin und
>der bekommt mit was ihr da treibt. ...
Welche Probleme können in diesem fall auftreten, und mit welchen 
routinen kann ich ihnen ausweichen?

>>Zum Konzept: Zur Registrierung ist ein Installationsprogramm da.(kann
auch eine Batch datei sein)
In eine Batch Datei würde ich schreiben:
copy MSCOMM32.OCX c:\windows\system32
regsvr32 /s c:\windows\system32\MSCOMM32.OCX
regedit.exe /s MSCOMM32.reg
irgendwie entgeht mir warum das anders ist als es in das VBA-Modul 
einzubinden.
Natürlich muss das modul checken ob das schon geschehen ist, um höhere 
Versionen nicht zu überschreiben.

>Was hast du in den 127 Stunden getan?
Zugegeben, ich hab mich ein bisschen verrannt. zunächst wurde 
festgehalten dass ich MSCOMM nicht verwenden darf -> Also wollte ich 
über API gehen. Dann kam heraus dass das RS232 gerät auch den Computer 
anrufen darf - also brauchte ich ein Event, und habe mich in 
Multithreading für Vb eingelesen. Nachdem ich das nicht stabil bekommen 
habe arbeite ich jetzt daran MSCOMM so einzubauen dass man es nciht 
merkt, und es auch keinen stört.

Aktuelle version des "lernunwilligen von 1996"-Codes
Option Explicit

Private Declare Function GetSystemDirectory Lib "kernel32" Alias _
 "GetSystemDirectoryA" (ByVal lpBuffer As String, _
 ByVal nSize As Long) As Long

Private Declare Function GetShortPathName Lib "kernel32.dll" Alias "GetShortPathNameA" _
  (ByVal lpszLongPath As String, ByVal lpszShortPath As String, _
  ByVal cchBuffer As Long) As Long

Private Function shortenAPIstring(API_INPUT As String) As String
    Dim m, OUTPUT As String
    Dim switch As Boolean
    switch = False
    OUTPUT = ""
    Do
        m = Left(API_INPUT, 1)
        If (m >= Chr(32) And m <= Chr(126)) Then
            OUTPUT = OUTPUT + m
            API_INPUT = Right(API_INPUT, Len(API_INPUT) - 1)
        Else
            switch = True
        End If
    Loop Until (switch)
    shortenAPIstring = OUTPUT
End Function

Private Function PathToShortName(LONGPATH As String) As String
    Dim SHORTNAME As String * 1024
    Call GetShortPathName(LONGPATH, SHORTNAME, Len(SHORTNAME))
    PathToShortName = shortenAPIstring(SHORTNAME)
End Function

Public Sub REGISTER_MSCOMM()
    Dim SysDir_API As String * 261
    Dim SysDir, OCXPath, LicenseCall, Destpath, m As String
    
    Dim COPYOCX, REGOCX, LICENSEOCX As Boolean
'TODO ABFRAGEN DURCHFÜHREN
    COPYOCX = True
    REGOCX = True
    LICENSEOCX = True

'Initialisierung
    SysDir = ""
    Call GetSystemDirectory(SysDir_API, 260)
    SysDir = shortenAPIstring(SysDir_API)
' Benötigte Pfade
    OCXPath = DieseArbeitsmappe.Path & "\" & "MSCOMM32.OCX"
    LicenseCall = "regedit.exe /s " + PathToShortName(DieseArbeitsmappe.Path & "\" & "MSCOMM.reg")
    Destpath = SysDir & "\" & "MSCOMM32.OCX"
'*********************** Systemaufrufe
    If COPYOCX Then _
        FileCopy OCXPath, Destpath 'MSCOMM32.OCX nach System32 kopieren
    If REGOCX Then _
        Call Shell("regsvr32 /s " & SysDir & "\MSCOMM32.OCX", vbHide) 'MSCOMM32.OCX beim system registrieren
    If LICENSEOCX Then _
        Call Shell(LicenseCall, vbHide) 'MSCOMM Lizenz beim system eintragen
End Sub

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>>Das Konzept ist fehlerhaft wenn es mich im Ausüben meiner tätigkeit
>>>behindert. Was nutzt m....
>>Ich kenne die Problematik aus dem Support im Uni-Bereich.
>>Ich kann dazu nur sagen, ich hoffe ihr habt einen kompetenten Admin und
>>der bekommt mit was ihr da treibt. ...
>Welche Probleme können in diesem fall auftreten, und mit welchen
>routinen kann ich ihnen ausweichen?
Kommt drauf an wie sauer dein Admin auf dich ist, wenn er herausfindet, 
daß DU für die gelockerten Sicherheitseinstellungen von Windows und 
Office verantwortlich bist. Ich schätze wenn es gerade trotz 
Virenscanner und Firewall einen zerstörerischen ActiveX oder 
Macrovirenausbruch gab, würde ich als routine zum Ausweichen nur noch 
rennen empfehlen.
Ich weiß ja nicht wo du arbeitest, aber normalerweise ist das so daß 
Nutzer nur mit eingeschränkten Rechten arbeiten. Deshalb bekommst du 
Probleme beim Registrieren, es könnte ja auch der neueste ActiveX Virus 
sein der sich durch eine Sicherheitslücke des IE gerade registrieren 
will.
Wenn ein Programm installiert wird, sollte der Admin informiert sein.
Das Programm hat ein Installationsprogramm (in deinem Fall die 
batchdatei)
die registriert MSCOMM.OCX und installiert das Programm in einen Pfad.
Dazu werden adminrechte benötigt aber nur bei der Installation.
Zum ausführen müssen Makros in Office erlaubt sein, sonst fnktioniert es 
nicht. Sowas sollte nur mit Rücksprache geändert werden aufgrund der 
Makrovirenproblematik.

Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn ein Programm installiert wird, sollte der Admin informiert sein.
>Das Programm hat ein Installationsprogramm (in deinem Fall die
>batchdatei) die registriert MSCOMM.OCX und installiert das Programm in einen 
Pfad.
>Dazu werden adminrechte benötigt aber nur bei der Installation.
>Zum ausführen müssen Makros in Office erlaubt sein, sonst fnktioniert es
>nicht. Sowas sollte nur mit Rücksprache geändert werden aufgrund der
>Makrovirenproblematik.
Ich bin auf meinem Rechner Admin, die Laborrechner sind IMO auch 
standardmäßig Admin. Ist aber natürlich ein vernünftiger Einwand.
Ich arbeite gerade an der Überprüfung ob die keys bereits angelegt sind.
Sobald ich damit fertig bin überprüfe ich ob der Rechner bereits als 
admin läuft, tut er das nicht, fordere ich das Passwort und verwende 
RUNAS in der shell.

Dann muss man den admin rufen -> ich bin aus dem Schneider :)

>Das geht ja hier richtig farbig...
OT: Hat mich auch schon begeistert :)

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was mich wundert ist, daß du dich mit den Installationsproblemen 
herumschlägst. Hast du den Rest schon geschrieben?

Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Parallel baue ich noch das gerät, dass dann communiziert.
Ich kann also noch gar keine Details programmieren.
Ich warte noch auf Platinen, dann gehts los :)
Außerdem gibt es eine Vorversion, an der insbesondere dieses problem 
beanstandet wurde.

Die Kommunikation selbst ist dann leicht, das hatte ich wirklich in 
einer Stunde fertig. Ich habe mit einem Kraftmeter herumgespielt - war 
einfach.

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ist aber natürlich ein vernünftiger Einwand.
Es gibt noch einen Grund (außer kein Ärger mit Admin)
unterschätze nicht die mögliche Laufzeit deines Programmes.
An der Uni hatte ich eines (2000) das war noch für Turbopascal 3.0 aus 
für einen CP/M(anno 1985?) Rechner.
Trenne installation und Programm, da zu erwarten ist, daß die Rechte 
eines Nutzers aus Sicherheitsgründen weiter eingeschränkt werden.( Von 
Admin/Betriebssystem/SP)
Das Konzept installation mit adminrechten, ausführen mit Nutzerrechten 
dürfte sich da besser einfügen.

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Parallel baue ich noch das gerät, dass dann communiziert.
>Ich kann also noch gar keine Details programmieren.
Ich schätze auf dem Gerät in C.
Programmiere es doch auf einem 2. PC, da kannst du schon weitermachen 
und beide Seiten testen. Nebenbei wird der Code plattformunabhängiger.

Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Programmiere es doch auf einem 2. PC, da kannst du schon weitermachen
Gute Idee,... mach ich wahrscheinlich

Der Code um MSCOMM einzubinden ist soweit fertig. Jetzt muss ich nur 
noch klasse erstellen, kontrollieren, verwenden.

Administrator@Domäne müsste man anpassen, ist aber im Firmennetzwerk mit 
übergreifender Domäne unkritisch.
Option Explicit

'Konstanten
Const HKEY_CLASSES_ROOT = &H80000000
Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_USERS = &H80000003
Const HKEY_PERFORMANCE_DATA = &H80000004
Const HKEY_CURRENT_CONFIG = &H80000005
Const HKEY_DYN_DATA = &H80000006
Const KEY_QUERY_VALUE = &H1
Const ERROR_SUCCESS = 0&
Const KEY_EXECUTE = &H20019
Const USERISADMIN = 1

'API AUFRUFE
Private Declare Function GetSystemDirectory Lib "kernel32" Alias _
 "GetSystemDirectoryA" (ByVal lpBuffer As String, _
 ByVal nSize As Long) As Long

Private Declare Function GetShortPathName Lib "kernel32.dll" Alias "GetShortPathNameA" _
  (ByVal lpszLongPath As String, ByVal lpszShortPath As String, _
  ByVal cchBuffer As Long) As Long

Private Declare Function RegOpenKeyEx Lib "advapi32.dll" _
        Alias "RegOpenKeyExA" (ByVal HKEY As Long, ByVal _
        lpSubKey As String, ByVal ulOptions As Long, _
        ByVal samDesired As Long, phkResult As Long) _
        As Long

Private Declare Function RegCloseKey Lib "advapi32.dll" _
        (ByVal HKEY As Long) As Long

Private Declare Function IsNTAdmin Lib "advpack.dll" (ByVal dwReserved As Long, ByRef lpdwReserved As Long) As Long


'INTERFACE FUNKTIONEN
Private Function shortenAPIstring(API_INPUT As String) As String
    Dim m, OUTPUT As String
    Dim switch As Boolean
    switch = False
    OUTPUT = ""
    Do
        m = Left(API_INPUT, 1)
        If (m >= Chr(32) And m <= Chr(126)) Then
            OUTPUT = OUTPUT + m
            API_INPUT = Right(API_INPUT, Len(API_INPUT) - 1)
        Else
            switch = True
        End If
    Loop Until (switch)
    shortenAPIstring = OUTPUT
End Function

Private Function PathToShortName(LONGPATH As String) As String
    Dim SHORTNAME As String * 1024
    Call GetShortPathName(LONGPATH, SHORTNAME, Len(SHORTNAME))
    PathToShortName = shortenAPIstring(SHORTNAME)
End Function

Private Function KEYEXISTS(HKEY As Long, SubKey As String) As Boolean
    Dim KnowerOfKeyStatus As Boolean
    Dim Result, handle As Long
    Result = RegOpenKeyEx(HKEY, SubKey, 0, KEY_EXECUTE, handle)
    If Result = ERROR_SUCCESS Then
        KnowerOfKeyStatus = True
    Else
        KnowerOfKeyStatus = False
    End If
    RegCloseKey (handle)
    KEYEXISTS = KnowerOfKeyStatus
End Function


'KERNFUNKTION
Public Sub REGISTER_MSCOMM()
    Dim SysDir_API As String * 261
    Dim SysDir, OCXPath, LicenseCall, Destpath, m As String
    Dim COPYOCX, REGOCX, LICENSEOCX As Boolean
    Dim USER_STATUS
'Initialisierung
    USER_STATUS = IsNTAdmin(ByVal 0&, ByVal 0&)
    SysDir = ""
    Call GetSystemDirectory(SysDir_API, 260)
    SysDir = shortenAPIstring(SysDir_API)
' Benötigte Pfade
    OCXPath = DieseArbeitsmappe.PATH & "\" & "MSCOMM32.OCX"
    LicenseCall = "regedit.exe /s " + PathToShortName(DieseArbeitsmappe.PATH & "\" & "MSCOMM.reg")
    Destpath = SysDir & "\" & "MSCOMM32.OCX"
'ABFRAGEN DURCHFÜHREN
    If Dir(Destpath) = "" Then
        COPYOCX = True
    Else
        COPYOCX = False
    End If
    REGOCX = Not KEYEXISTS(HKEY_LOCAL_MACHINE, "SOFTWARE\Classes\MSCOMMLib.MSComm")
    LICENSEOCX = Not KEYEXISTS(HKEY_CLASSES_ROOT, "Licenses\4250E830-6AC2-11cf-8ADB-00AA00C00905")
'*********************** Systemaufrufe
    If Not USER_STATUS = USERISADMIN And ((COPYOCX) Or (REGOCX) Or (LICENSEOCX)) Then
        MsgBox ("Ein Problem ist aufgetreten" & vbLf & "Der Benutzer hat keine ADMIN rechte, und es ist eine Teilinstallation erforderlich" & vbLf & "Sie werden nun ein bis drei mal aufgefordert das Passwort für den Account 'Administrator' einzugeben." + vbLf + "Sollten die Probleme weiter auftreten loggen sie sich einmalig als administrator ein, und starten sie das Programm erneut.")
        If COPYOCX Then _
            FileCopy OCXPath, Destpath 'MSCOMM32.OCX nach System32 kopieren
        If REGOCX Then _
            Call Shell("runas /user:Administrator@Domäne " + "regsvr32 /s " & SysDir & "\MSCOMM32.OCX", vbHide) 'MSCOMM32.OCX beim system registrieren
        If LICENSEOCX Then _
            Call Shell("runas /user:Administrator@Domäne " + LicenseCall, vbHide) 'MSCOMM Lizenz beim system eintragen
    Else
        If COPYOCX Then _
            FileCopy OCXPath, Destpath 'MSCOMM32.OCX nach System32 kopieren
        If REGOCX Then _
            Call Shell("regsvr32 /s " & SysDir & "\MSCOMM32.OCX", vbHide) 'MSCOMM32.OCX beim system registrieren
        If LICENSEOCX Then _
            Call Shell(LicenseCall, vbHide) 'MSCOMM Lizenz beim system eintragen
    End If
End Sub

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, bin durch Zufall hier vorbei gekommen...

Du hast zwei serielle Schnittstellen und wenn auf den Schnittstellen 
sich was tut, musst DU also was machen. - hmm -

Wenn sich WAS tut, musst Du WAS machen?

Wenn Daten einfliegen, diese speichern (im ExcelBlatt oder in einer 
Datei)?
Oder was ganz anderes?

Denn Funktionen in VBA, welche auf die serielle Schnittstelle zugreifen 
können, kann man sehr gut auch ohne MSCOMM uswusf. realisieren.

Ob das jetzt was nützt, weiss ich nicht, Du kannst Dir den Link ja mal 
ansehen
Beitrag "Re: benötige Hilfe zu Excel Makro"
Das hantieren mit eventmessages auf "Layer Null" erscheint mir 
allerdings auch zu riskant. Aber vielleicht gehts es ja nicht anders.

Viel Erfolg
AxelR.

Autor: E. V. (littleunwell)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hoff, ich darf mal ne kurze Frage zwischendurch stellen.

Ich arbeite mit VB.Net und will auf eine Chipkarte zugreifen... diese 
steckt in einem Kartenleser der an einem USB-Port steckt... aber ich 
weiß nicht mal wie ich mittels VB.net auf diesen Kartenleser zugreifen 
kann...

Könnt ihr mir helfen und sagen, wie ich den USB-Port am besten 
anspreche?

Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mittlerweile funktioniert das mit MSCOM wirklich gut.

>Wenn sich WAS tut, musst Du WAS machen?
>Wenn Daten einfliegen, diese speichern (im ExcelBlatt oder in einer
Datei)?
>Oder was ganz anderes?

Wenn sich egal was tut, muss ich egal was machen :)
Was ich wann tue ist imo recht schnuppe.
Im Detail sendet das Gerät einen String, der dann aufgeschlüsselt werden 
muss, und je nach string muss anders reagiert werden.

>Denn Funktionen in VBA, welche auf die serielle Schnittstelle zugreifen
können, kann man sehr gut auch ohne MSCOMM uswusf. realisieren.

Ja, kann man. Ich wollte um MSCOM herum, weil es A) eine registrierung 
im System benötigt und B) zusätzliche Dateien braucht.
Es gibt in VB6.0 aber IMO keinen Weg um MSCOMM herum, da Multithreading 
nicht stabil zum Laufen gebracht werden kann.

>Ob das jetzt was nützt, weiss ich nicht, Du kannst Dir den Link ja mal
ansehen Beitrag "Re: benötige Hilfe zu Excel Makro"

Cool, danke. Das werde ich mir definitiv durchlesen.

>Ich hoff, ich darf mal ne kurze Frage zwischendurch stellen.
Mach besser deinen eigenen Thread auf, dieser neigt sich zum Ende.

>Ich arbeite mit VB.Net und will auf eine Chipkarte zugreifen... diese
steckt in einem Kartenleser der an einem USB-Port steckt... aber ich
weiß nicht mal wie ich mittels VB.net auf diesen Kartenleser zugreifen
kann...

>Könnt ihr mir helfen und sagen, wie ich den USB-Port am besten
anspreche?

Mit USB habe ich keine große erfahrung, und bin davon derzeit wieder 
abgekommen.

Generell scheint man aber eine GUID zu brauchen, die man über das 
system, oder mitgelieferte Treiber erhalten kann. Die GUID ist eine Art 
Zeiger auf eine Liste von Geräten, die man auf das Richtige Gerät hin 
durchsucht (handle aufmachen, schauen, ggf handle zumachen) Hast Du 
einmal den richtigen Handle, musst Du mit den funktionen im 
mitgelieferten Treiber das Gerät benutzen.

Das ist nur ein kleiner Richtungshinweis. Mit etwas glück korrigiert 
mich gleich ein vollprofi :)

Grüße, und Dank allen für ihre Hilfe.
Insbesondere Wolfram.

Autor: E. V. (littleunwell)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Antwort... leider kenn ich mich immer noch kein bisschen 
aus...

Also was ich genau machen will:
In einem Kartenleser, der am USB-Port hängt, ist eine Chip-Karte. Auf 
dem Chip dieser Karte befindet sich ein Zertifikat... dieses soll 
gelesen werden und als Enum abgespeichert werden. Und ich habe noch 
nicht mal einen kleinen Ansatz dies zu lösen :(

Da ich neu bin bei VB.Net - dies aber nur mit VB.Net lösen will (um dies 
besser kennen zu lernen) - brauche ich jeden kleinsten Hinweis, den ich 
bekommen kann...

PS: Ich habe keine Software zum Kartenleser

Danke im schon im Voraus

Autor: E. V. (littleunwell)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: wie kann ich eventuell eine GUID in mein Programm einbauen?

Autor: Johannes H. (johannes-kuriboh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn sich egal was tut, muss ich egal was machen :)
>Was ich wann tue ist imo recht schnuppe.
Fast,
du mußt sicherstellen das zu einem Zeitpunkt immer nur einer schreibend 
Zugriff auf Variablen, die in mehreren Events benutzt werden, hat.

Autor: E. V. (littleunwell)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes H. wrote:
> Du solltest wirklich einen eigenen Thread starten :)

hab i bereits :)



trotzdem würd ich noch gerne wissen, wie ich den GUID verwenden kann 
bzw. welche? Geräteklasse-GUID oder Bustyp-GUID? Oder ginge das nicht 
mit der Geräte-ID?

Autor: thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der Zugriff auf Kartenleser erfolgt uber die CT-API oder den PCSC 
Treiber.
diese erhält man beim Kartenleserhersteller (download).
Welchen Leser hast du?
Vieleicht kann ich dir weiterhelfen.

thomas

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.