Hallo Hubert!
Post by Hubert HollerIch habe in einer MS-Access Tabelle ein OLE Datenfeld, wo ich Long
binary-Daten abgelegt habe.
Noch etwas:
Um welche Objekte handelt es sich? Nur um Bilder desselben Typs, oder
verschiedenste Dateien, die mit jeweils eigenen Programmen geöffnet werden?
Ich frage deshalb, da OLE-Objekte immer die gesamte Datei im OLE-Datenfelder
speichern, egal ob Du im Form verknüpft oder eingebettet einstellst.
Wenn Du also das Bild auf deinem Rechner hast, ist es damit ein zweites Mal
gespeichert.
Deshalb würde ich grundsätzlich auf OLE-Datenfelder verzichten und nur
Dateinamen speichern,
wobei mit Doppelklick die zugehörige Anwendung gestartet wird.
Weiters ist mir aufgefallen, daß in dem MS-Beipiel unter
http://support.microsoft.com/kb/q170531/
nicht der Header der OLE-Daten untersucht wird, sondern gehofft wird, daß
irgendwo in den Felddaten
":/" oder ein UNC-Pfad enthalten ist. Das ist nicht sehr effizient, deshalb
auch die Anmerkung,
daß der Code nicht immer funktioniert.
Speichere also besser den Dateinamen.
Anbei noch der Code zum Öffnen der mit einer Dateispezifikation verknüpften
Anwendung:
Private Declare Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" (ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) _
As Long
' Fenster-Handle des Desktops (für ShellExecute)
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetSystemDirectory Lib "kernel32" _
Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, _
ByVal nSize As Long) _
As Long
' Dokument öffnen
Private Const SE_ERR_NOASSOC = 31
Private Const SE_ERR_NOTFOUND = 2
' Dokument öffnen und ggf. autom. den "Öffnen mit..." - Dialog anzeigen
Sub DocumentOpen(sFilename As String)
Dim sDirectory As String
Dim lRet As Long
Dim DeskWin As Long
DeskWin = GetDesktopWindow()
lRet = ShellExecute(DeskWin, "open", sFilename, _
vbNullString, vbNullString, vbNormalNoFocus)
If lRet = SE_ERR_NOTFOUND Then
'Datei nicht gefunden
ElseIf lRet = SE_ERR_NOASSOC Then
'Wenn die Dateierweiterung noch nicht bekannt ist...
'wird der "Öffnen mit..."-Dialog angezeigt.
sDirectory = Space(260)
lRet = GetSystemDirectory(sDirectory, Len(sDirectory))
sDirectory = Left(sDirectory, lRet)
Call ShellExecute(DeskWin, vbNullString, _
"RUNDLL32.EXE", "shell32.dll,OpenAs_RunDLL " & _
sFilename, sDirectory, vbNormalFocus)
End If
End Sub