Kirjoitan ensimmäistä kertaa...
Eli voisiko joku selittää, mikä on App.Path ja miten sitä hyödynnetään?
Olen yrittänyt saada vb-käyttöliittymää avamaan Accesilla tehtyä itsenäisesti toimivaa tietokantasovellusta (mdb, eli
siinä on main switchboard).
Olen kaivellut erillaisia ohjeita pitkin nettiä, ja kaikki ohjeet tiedoston avaamisesta oletussovelluksessa antavat ohjeeksi käyttää App.path:a. Notepadin saan kyllä auki näin, mutta muita ohjelmia en.
App.Path sisältää hakemiston, johon ohjelma sillä hetkellä on tallennettu. Hyötyä App.Pathista on esimerkiksi silloin, kun samassa hakemistossa on kuva tai muu tiedosto, jota ohjelma käyttää. Ohjelman ja näin ollen tiedoston hakemisto taas tietenkin on jokaisella käyttäjällä eri. Siksi siihen ei voi viitata suoraan vaan App.Pathin avulla.
No johan selvitti. Käsitin aluksi, että tuon avattavan tiedoston pitäisi olla samassa hakemistossa, kuin vb-ohjelman...
Eli mitenkähän homma menee silloin, kun tuo mdb-tiedosto on jossain toisessa hakemistossa, kuin itse ohjelma.
Ohjelman saan avattua alla olevalla pätkällä, mutta miten saisin siihen avattua tietyn tiedoston jostain muualta?
On muuten nopeaa toimintaa vastausten kanssa.kiitokset.
Private Sub acces_Click()
If Dir("C:\Ohjelmatiedostot\Microsoft Office\Office\msaccess.exe") <> "" Then
Dim pInfo As PROCESS_INFORMATION
Dim sInfo As STARTUPINFO
Dim sNull As String
Dim lSuccess As Long
Dim lRetValue As Long
sInfo.cb = Len(sInfo)
lSuccess = CreateProcess(sNull, _
"C:\Ohjelmatiedostot\Microsoft Office\Office\msaccess.exe", _
ByVal 0&, _
ByVal 0&, _
1&, _
NORMAL_PRIORITY_CLASS, _
ByVal 0&, _
sNull, _
sInfo, _
pInfo)
Else
acces.Enabled = False
End If
End SubJa vielä unohtui; formin alussa on tällainen pätkä:
(turha kysyä, minkä vuoksi tai mitä se tekee...)
Option Explicit
Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type
Private Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
Private Declare Function CreateProcess Lib "kernel32" _
Alias "CreateProcessA" _
(ByVal lpApplicationName As String, _
ByVal lpCommandLine As String, _
lpProcessAttributes As Any, _
lpThreadAttributes As Any, _
ByVal bInheritHandles As Long, _
ByVal dwCreationFlags As Long, _
lpEnvironment As Any, _
ByVal lpCurrentDriectory As String, _
lpStartupInfo As STARTUPINFO, _
lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function OpenProcess Lib "kernel32.dll" _
(ByVal dwAccess As Long, _
ByVal fInherit As Integer, _
ByVal hObject As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" _
(ByVal hProcess As Long, _
ByVal uExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long
Const SYNCHRONIZE = 1048576
Const NORMAL_PRIORITY_CLASS = &H20&Onko sinulla jotain erityistä syytä käyttää CreateProcess-funktiota? Jos haluat pelkästään avata tiedoston tietyllä ohjelma, ShellExecute riittää ihan hyvin. Ks. https://www.ohjelmointiputka.net/koodivinkit/
Kannattaa muuten huomioida, että Access ei välttämättä ole asennettu tuohon hakemistoon.
Vastaan ihka enstemäistä kertaa. Jos käytät Visual Basicia, oletko kokeillut Data-ohjainta (vakiona) ja esim. DBGrid-ohjainta (lisättävä Project - Components - lomakkeelta). Tietokantaa voi selata ja päivittää kirjoittamatta tavuakaan koodia. Tietokanta ja taulu määritellään suunnittelutilassa Data-ohjaimelle.
Kiitokset Antille...
Rupesin hieman epäilemään itseäni, kun kaikki ohjeet ympäri
maailmaa neuvoivat tuota shellExecute-juttua...
...ja aihetta olikin. Tuo viimeinen kommentti, että onko acces asennettu tuohon hakemistoon... Olen tehnyt tuhottomasti töitä aivan törkeän huolimattomuusvirheen takia.
Aihe on jo aika vanha, joten et voi enää vastata siihen.