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 Sub
Ja 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.