Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1664to1668
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Foto schießen in Userform importieren

Foto schießen in Userform importieren
04.01.2019 21:22:13
Marco
Hallo liebe Forumsmitglieder,
ich habe ein kleines Kassensystem für unseren Skiverleih geschrieben. Hierbei machen wir ein Foto von Adressdaten, um nicht alles abschreiben zu müssen. Alles lief prima, aber...
Auf meinem neuen Laptop gibt es einen Compilerfehler. Vermutlich weil dieser 64-bit hat . In dem Code zum Aufnehmen des Fotos via Webcam (den ich nicht verstehe) werden viele .dll genutzt welche alle ein 32 im Namen tragen. Vermutlich ist das das Problem. Kennt einer eine Möglichkeit, wie man ein Foto schießt und dieses in eine Userform anzeigt auf einem 64-bit System?
Viele Grüße
Marco

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Foto schießen in Userform importieren
04.01.2019 22:07:40
Marco
Hallo nochmal,
ich poste hier mal den alten Code:
Option Explicit
Private Declare Function capCreateCaptureWindowA Lib "avicap32.dll" ( _
ByVal lpszWindowName As String, _
ByVal dwStyle As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal hWndParent As Long, _
ByVal nID As Long) As Long
Private Declare Function SendMessageA Lib "user32.dll" ( _
ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Private Declare Function DestroyWindow Lib "user32.dll" ( _
ByVal hWnd As Long) As Long
Private Declare Function FindWindowA Lib "user32.dll" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" ( _
ByRef PicDesc As PIC_DESC, _
ByRef RefIID As GUID, _
ByVal fPictureOwnsHandle As Long, _
ByRef IPic As IPictureDisp) As Long
Declare Function CopyImage Lib "user32.dll" ( _
ByVal handle As Long, _
ByVal un1 As Long, _
ByVal n1 As Long, _
ByVal n2 As Long, _
ByVal un2 As Long) As Long
Private Declare Function IsClipboardFormatAvailable Lib "user32.dll" ( _
ByVal wFormat As Integer) As Long
Private Declare Function OpenClipboard Lib "user32.dll" ( _
ByVal hWnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32.dll" ( _
ByVal wFormat As Integer) As Long
Private Declare Function EmptyClipboard Lib "user32.dll" () As Long
Private Declare Function CloseClipboard Lib "user32.dll" () As Long
Anzeige
AW: Foto schießen in Userform importieren
04.01.2019 23:54:07
Karl-Heinz
Hallo Marco,
wenn Du nun ein 64-Bit-Betriebssystem hast, benötigst Du in der Tat, wie schon vermutet, andere Declares.
Hierbei bleibt der DLL-Name bzgl. der 32 jedoch durchaus gleich.
Neu ist das Schlüsselwort SafePtr im Declare, außerdem sind alle Handle nicht mehr als Long sondern als LongPtr zu deklarieren.
Hier einige Beispiele zu Deinen Declares:
Declare PtrSafe Function EmptyClipboard Lib "user32" Alias "EmptyClipboard" () As Long
Declare PtrSafe Function IsClipboardFormatAvailable Lib "user32" Alias "IsClipboardFormatAvailable" (
ByVal wFormat As Long) As Long
Declare PtrSafe Function OpenClipboard Lib "user32" Alias "OpenClipboard" (ByVal hwnd As LongPtr) As Long
Declare PtrSafe Function CloseClipboard Lib "user32" Alias "CloseClipboard" () As Long
Da ich Dir meine Declare-Sammlung, aus der Du Dir die 64-Bit-Declares raussuchen kannst, nicht hochladen kann (zu groß), such sie selbst im Internet. Leider sind da auch nicht alle drin. Ggf. also selbst im Internet weiter recherchieren.
Windows64API_Declares.txt
viel Erfolg dabei und viele Grüße
Karl-Heinz
Anzeige
AW: Foto schießen in Userform importieren
06.01.2019 14:12:49
Marco
Hallo Karl-Heinz,
Dein Text ist bei mir iwie ein bißchen untergegangen. Woran erkenne ich denn was "Handle" sind und wo ich longptr als Variablentyp angeben muss?
Inwiefern muss ich 64bit dlls suchen? Funktioniert es nicht so wie Du oben beschrieben hast?
Viele Grüße
Marco
AW: Foto schießen in Userform importieren
04.01.2019 22:09:35
Sepp
Hallo Marco,
zeig doch den Code oder sollen wir raten, welch dll's du verwendest?
 ABCDEF
1Gruß Sepp
2
3

Anzeige
AW: Foto schießen in Userform importieren
04.01.2019 22:13:14
Marco
Die .dll s sieht man oben. Hier der Code:
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Type PIC_DESC
lngSize As Long
lngType As Long
lnghPic As Long
lnghPal As Long
End Type
Private Const PICTYPE_BITMAP = 1
Private Const CF_BITMAP = 2
Private Const IMAGE_BITMAP = 0
Private Const LR_COPYRETURNORG = &H4
Private Const GC_CLASSNAMEMSUSERFORM = "ThunderDFrame"
Private Const WS_CHILD = &H40000000
Private Const WS_VISIBLE = &H10000000
Private Const WM_CAP_START = &H400
Private Const WM_CAP_EDIT_COPY = (WM_CAP_START + 30)
Private Const WM_CAP_DRIVER_CONNECT = (WM_CAP_START + 10)
Private Const WM_CAP_SET_PREVIEWRATE = (WM_CAP_START + 52)
Private Const WM_CAP_SET_OVERLAY = (WM_CAP_START + 51)
Private Const WM_CAP_SET_PREVIEW = (WM_CAP_START + 50)
Private Const WM_CAP_DRIVER_DISCONNECT = (WM_CAP_START + 11)
Private Const WM_CAP_GRAB_FRAME = (WM_CAP_START + 60)
Private llngCamHandle As Long
Private lintTries As Integer
Private lblnCameraOpen As Boolean
Private Sub GrabPicture()
Call SendMessageA(llngCamHandle, WM_CAP_GRAB_FRAME, 0&, 0&)
Call SendMessageA(llngCamHandle, WM_CAP_EDIT_COPY, 0&, 0&)
End Sub

Public Sub CloseCamera()
Call SendMessageA(llngCamHandle, WM_CAP_DRIVER_DISCONNECT, 0&, 0&)
Call DestroyWindow(llngCamHandle)
End Sub

Private Sub OpenCamera(hWndParent As Long, plngWidth As Long, plngHeight As Long)
If Not lblnCameraOpen Then
On Error GoTo error_handler
llngCamHandle = capCreateCaptureWindowA("Video", WS_CHILD Or _
WS_VISIBLE, 0&, 0&, plngWidth, plngHeight, hWndParent, 0&)
Call SendMessageA(llngCamHandle, WM_CAP_DRIVER_CONNECT, 0&, 0&)
Call SendMessageA(llngCamHandle, WM_CAP_SET_PREVIEWRATE, 30&, 0&)
Call SendMessageA(llngCamHandle, WM_CAP_SET_OVERLAY, 1&, 0&)
Call SendMessageA(llngCamHandle, WM_CAP_SET_PREVIEW, 1&, 0&)
Exit Sub
End If
error_handler:
End Sub

Private Function Paste_Picture() As IPictureDisp
Dim lngReturn As Long, lngCopy As Long, lngPointer As Long
If IsClipboardFormatAvailable(CF_BITMAP)  0 Then
lngReturn = OpenClipboard(Application.hWnd)
If lngReturn > 0 Then
lngPointer = GetClipboardData(CF_BITMAP)
lngCopy = CopyImage(lngPointer, IMAGE_BITMAP, 0&, 0&, LR_COPYRETURNORG)
Call CloseClipboard
If lngPointer  0 Then Set Paste_Picture = Create_Picture(lngCopy)
End If
End If
End Function

Private Function Create_Picture( _
ByVal lnghPic As Long) As IPictureDisp
Dim udtPicInfo As PIC_DESC, udtID_IDispatch As GUID
Dim objPicture As IPictureDisp
With udtID_IDispatch
.Data1 = &H20400
.Data4(0) = &HC0
.Data4(7) = &H46
End With
With udtPicInfo
.lngSize = Len(udtPicInfo)
.lngType = PICTYPE_BITMAP
.lnghPic = lnghPic
.lnghPal = 0
End With
Call OleCreatePictureIndirect(udtPicInfo, udtID_IDispatch, 0&, objPicture)
Set Create_Picture = objPicture
End Function

Public Sub GetCameraPicture(pic As Image)
Dim lngHwnd As Long
Dim objPicture As IPictureDisp
Call OpenClipboard(0&)
Call EmptyClipboard
Call CloseClipboard
If Not lblnCameraOpen Then
lngHwnd = FindWindowA(GC_CLASSNAMEMSUSERFORM, UserForm2.Caption)
Call OpenCamera(lngHwnd, 320, 240)
End If
Call GrabPicture
Set objPicture = Paste_Picture
If Not objPicture Is Nothing Then
lblnCameraOpen = True
Set pic.Picture = objPicture
lintTries = 0
Else
lblnCameraOpen = False
If lintTries 

Anzeige
AW: Foto schießen in Userform importieren
04.01.2019 23:25:30
onur
Versuch das:
statt
Private Declare Function
das:
Private Declare PTRSAFE Function
AW: Foto schießen in Userform importieren
06.01.2019 12:26:45
Marco
Hallo onur,
es schien sehr vielversprechend. Der Code zeigt keinen Fehler mehr an. Aber bei der Ausführung des Codes findet er .dll nicht. Bei olepro32.dll ist er mit Laufzeitfehler 53 Datei nicht gefunden ausgestiegen.
Viele Grüße
Marco
AW: Foto schießen in Userform importieren
05.01.2019 10:06:37
Nepumuk
Hallo Marco,
teste mal:
https://www.herber.de/bbs/user/126501.xlsm
Aber ohne Garantie, ich habe nämlich kein 64Bit Office.
Gruß
Nepumuk
AW: Foto schießen in Userform importieren
05.01.2019 12:24:48
Nepumuk
Nochmal: Hallo Marco,
da ist noch ein Fehler drin:
Private Declare PtrSafe Function SendMessageA Lib "user32.dll" ( _
    ByVal hWnd As LongPtr, _
    ByVal wMsg As Long, _
    ByVal wParam As LongPtr, _
    ByVal lParam As Any) As LongPtr

Gruß
Nepumuk
Anzeige
AW: Foto schießen in Userform importieren
05.01.2019 17:03:24
Marco
Hallo,
erstmal vielen Dank für die Rückmeldungen. Meine zwei kleinen Kinder halten mich noch auf Trapp, aber heute abend werde ich alles testen.
Viele Grüße
Marco
AW: Foto schießen in Userform importieren
06.01.2019 12:46:43
Marco
Hallo Nepumuk,
erstmal danke für den Post. Die Datei läuft nicht. Leider ist es schwer den Fehler zu verstehen. Ich verstehe es zumindest nicht. Er öffnet die Kamera und dann springt er bei dem Aufruf der Function Paste_Picture in einen Fehler. Die Variable lngptrCopy ist leer und wahrscheinlich läuft die Zeile:
If lngptrPointer 0 Then Set Paste_Picture = Create_Picture(lngptrCopy) in einen Fehler.
Der Fehler ist Typen unverträglich.
Ich fürchte ich bräuchte noch weitere Unterstützung...
Anzeige
AW: Foto schießen in Userform importieren
06.01.2019 13:06:30
Nepumuk
Hallo Marco,
da kann ich dir nicht weiterhelfen, ich habe kein 64Bit - Office.
Gruß
Nepumuk
AW: Foto schießen in Userform importieren
06.01.2019 13:47:40
Marco
Hi Nepumuk,
trotzdem danke. Ich verstehe die .dll überhaupt nicht. Warum springt er gerade bei der olepro32 raus. Funktionieren die anderen?
Blöd ist das deine Beispielsdatei wahrscheinlich an einem anderen Problem gescheitert ist. Aber vielleicht auch nicht. Es ist echt bitter, dass ich den Code nicht nachvollziehen kann.
Kann noch wer anders helfen?
Viele Grüße
Marco
AW: Foto schießen in Userform importieren
06.01.2019 13:52:58
onur
Suche mal danach.
Schau hier:
Olepro32.dll Datei Info
Der Prozess TruckMate Updater gehört zur Software unbekannt der Firma Microsoft (www.microsoft.com).
Charakteristik: olepro32.dll gehört nicht zum Windows Betriebssystem und macht eher wenig Probleme. Olepro32.dll befindet sich im Ordner C:\Windows\System32. Bekannte Dateigrößen unter Windows 10/8/7/XP sind 90112 Bytes (84% aller Vorkommen), 79360 Bytes, 80384 Bytes, 86016 Bytes oder 90624 Bytes.
Anzeige
AW: Foto schießen in Userform importieren
06.01.2019 14:05:39
Marco
Hallo onur,
ich hatte mir jetzt die Datei im SysWOW64 Ordner angeschaut, aber ich werde Null daraus schlau. Vielleicht ist aber auch die Software schlecht. (DotPeek)
Ich weiß nicht wie mir Dein Hinweis helfen kann.
Hat noch jmd. eine Idee wie ich zu einer Lösung kommen könnte?
Viele Grüße
AW: Foto schießen in Userform importieren
06.01.2019 14:07:36
onur
Kopiere sie doch mal in C:\Windows\System32 hinein, vielleicht wird sie dann gefunden.
AW: Foto schießen in Userform importieren
06.01.2019 14:32:28
Marco
Hi Onur,
tatsächlich gabs die olepro32.dll nicht im System32 Ordner. Habe Sie reinkopiert und es kommt immernoch der gleiche Fehler. Sorry, dass ich so nerven muss.
Viele Grüße
Marco
Anzeige
AW: Foto schießen in Userform importieren
06.01.2019 14:42:23
onur
Schreib mal statt olepro32.dll das hier in den code:
oleaut32.dll
AW: Foto schießen in Userform importieren
07.01.2019 16:02:33
Marco
Hi Onur,
danke für die Hilfe. Ich gebs auf. Ich hab heute von nen Kollegen gehört, wo in einer Firma wegen einer Excelapplication überall wieder Office 32 bit installiert wurde. So werd ich es auch handhaben.
Trotzdem danke vielmals. Ich schwenke die weiße Flagge.
Viele Grüße
Marco

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige