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
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.
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.
Mit der Zeile erscheint der Error 7 Nicht genug speicher
Löscht man sie, läuft der Programmcode problemlos ab.
Ersetzt man sie mit
1
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
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.
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?
Sub mymultiobject_SendString(ByVal MessageString As String)
15
MsgBox (MessageString)
16
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.
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.
Ü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.
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.
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
>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.
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.
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:
1
Public Sub thiswillbethepowerthread() 'Der Multithread
2
Call CoInitialize(0)
3
Dim i As Integer
4
For i = 1 To Round(((Rnd * 3) + 1), 0)
5
MsgBox ("tada")
6
Next i
7
Call CoUninitialize
8
End Sub
im Hauptteil
1
Public Declare Function CloseHandle Lib "kernel32" _
2
(ByVal lpHandle As Long) _
3
As Long
4
Public Declare Function CreateThread Lib "kernel32" _
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?
>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).
>>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/RS232/MSCOMM.htm
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:
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 :)
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... ;-)
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.
>"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
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...
>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?
>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
1
Private Declare Function GetSystemDirectory Lib "kernel32" Alias _
2
"GetSystemDirectoryA" (ByVal lpBuffer As String, _
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 :)
>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....
>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.
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".
>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.
> 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:
1
copy MSCOMM32.OCX c:\windows\system32
2
regsvr32 /s c:\windows\system32\MSCOMM32.OCX
3
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
1
Option Explicit
2
3
Private Declare Function GetSystemDirectory Lib "kernel32" Alias _
4
"GetSystemDirectoryA" (ByVal lpBuffer As String, _
5
ByVal nSize As Long) As Long
6
7
Private Declare Function GetShortPathName Lib "kernel32.dll" Alias "GetShortPathNameA" _
8
(ByVal lpszLongPath As String, ByVal lpszShortPath As String, _
9
ByVal cchBuffer As Long) As Long
10
11
Private Function shortenAPIstring(API_INPUT As String) As String
12
Dim m, OUTPUT As String
13
Dim switch As Boolean
14
switch = False
15
OUTPUT = ""
16
Do
17
m = Left(API_INPUT, 1)
18
If (m >= Chr(32) And m <= Chr(126)) Then
19
OUTPUT = OUTPUT + m
20
API_INPUT = Right(API_INPUT, Len(API_INPUT) - 1)
21
Else
22
switch = True
23
End If
24
Loop Until (switch)
25
shortenAPIstring = OUTPUT
26
End Function
27
28
Private Function PathToShortName(LONGPATH As String) As String
>>>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.
>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 :)
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.
>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.
>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.
>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.
1
Option Explicit
2
3
'Konstanten
4
Const HKEY_CLASSES_ROOT = &H80000000
5
Const HKEY_CURRENT_USER = &H80000001
6
Const HKEY_LOCAL_MACHINE = &H80000002
7
Const HKEY_USERS = &H80000003
8
Const HKEY_PERFORMANCE_DATA = &H80000004
9
Const HKEY_CURRENT_CONFIG = &H80000005
10
Const HKEY_DYN_DATA = &H80000006
11
Const KEY_QUERY_VALUE = &H1
12
Const ERROR_SUCCESS = 0&
13
Const KEY_EXECUTE = &H20019
14
Const USERISADMIN = 1
15
16
'API AUFRUFE
17
Private Declare Function GetSystemDirectory Lib "kernel32" Alias _
18
"GetSystemDirectoryA" (ByVal lpBuffer As String, _
19
ByVal nSize As Long) As Long
20
21
Private Declare Function GetShortPathName Lib "kernel32.dll" Alias "GetShortPathNameA" _
22
(ByVal lpszLongPath As String, ByVal lpszShortPath As String, _
23
ByVal cchBuffer As Long) As Long
24
25
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" _
26
Alias "RegOpenKeyExA" (ByVal HKEY As Long, ByVal _
27
lpSubKey As String, ByVal ulOptions As Long, _
28
ByVal samDesired As Long, phkResult As Long) _
29
As Long
30
31
Private Declare Function RegCloseKey Lib "advapi32.dll" _
32
(ByVal HKEY As Long) As Long
33
34
Private Declare Function IsNTAdmin Lib "advpack.dll" (ByVal dwReserved As Long, ByRef lpdwReserved As Long) As Long
35
36
37
'INTERFACE FUNKTIONEN
38
Private Function shortenAPIstring(API_INPUT As String) As String
39
Dim m, OUTPUT As String
40
Dim switch As Boolean
41
switch = False
42
OUTPUT = ""
43
Do
44
m = Left(API_INPUT, 1)
45
If (m >= Chr(32) And m <= Chr(126)) Then
46
OUTPUT = OUTPUT + m
47
API_INPUT = Right(API_INPUT, Len(API_INPUT) - 1)
48
Else
49
switch = True
50
End If
51
Loop Until (switch)
52
shortenAPIstring = OUTPUT
53
End Function
54
55
Private Function PathToShortName(LONGPATH As String) As String
REGOCX = Not KEYEXISTS(HKEY_LOCAL_MACHINE, "SOFTWARE\Classes\MSCOMMLib.MSComm")
97
LICENSEOCX = Not KEYEXISTS(HKEY_CLASSES_ROOT, "Licenses\4250E830-6AC2-11cf-8ADB-00AA00C00905")
98
'*********************** Systemaufrufe
99
If Not USER_STATUS = USERISADMIN And ((COPYOCX) Or (REGOCX) Or (LICENSEOCX)) Then
100
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.")
101
If COPYOCX Then _
102
FileCopy OCXPath, Destpath 'MSCOMM32.OCX nach System32 kopieren
103
If REGOCX Then _
104
Call Shell("runas /user:Administrator@Domäne " + "regsvr32 /s " & SysDir & "\MSCOMM32.OCX", vbHide) 'MSCOMM32.OCX beim system registrieren
105
If LICENSEOCX Then _
106
Call Shell("runas /user:Administrator@Domäne " + LicenseCall, vbHide) 'MSCOMM Lizenz beim system eintragen
107
Else
108
If COPYOCX Then _
109
FileCopy OCXPath, Destpath 'MSCOMM32.OCX nach System32 kopieren
110
If REGOCX Then _
111
Call Shell("regsvr32 /s " & SysDir & "\MSCOMM32.OCX", vbHide) 'MSCOMM32.OCX beim system registrieren
112
If LICENSEOCX Then _
113
Call Shell(LicenseCall, vbHide) 'MSCOMM Lizenz beim system eintragen
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.
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?
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.
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
>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.
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?
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