|
Fixing missing shortcuts in cmd.exe |
Av: Ove Halseth |
Onsdag 30.05.2012 (11:10) |
I finally got annoyed enough to fix missing ALT-F4 and CTRL-V in command-prompt.
The solution is this AutoHotkey script:
; Language: English
; Platform: Win2k/XP/Vista/2k3 server/2k8 server
; Author: Ove Halseth <ove@wis.no>
#IfWinActive ahk_class ConsoleWindowClass
!F4:: Send !{SPACE}C
^V:: Send !{SPACE}EP
return
Ove B-) |
|
--Emner: Operativsystem, Utvikling, Windows
|
|
|
Redirect dll using manifests |
Av: Ove Halseth |
Onsdag 30.05.2012 (10:19) |
To break free from dll-hell you can use manifests to spesify that your application should use local dll's instead of system dll's.
As an added bonus you will not have to register the dll's with regsvr32 in order to use them. Nice if end user is not local admin.
In order to redirect exe to use local dll's all you need is a manifest file pr dll and a corresponding manifest file for the exe.
You could compile the exe-manifest file into the exe, but it's not required.
The most tricky part is to get the dll-manifest and the exe-manifest to work together.
Create dll-manifests
I'll recomend generating the dll-manifests using microsofts mt.exe (on Win2k8 R2 i found it in C:\Program Files\Microsoft\SDKs\Windows\v6.1\Bin\mt.exe)
The command line for generating dll-manifest is: mt.exe -tlb:example.dll -dll:example.dll -out:example.dll.manifest
Open the generated manifest file and clean it up by adding linebreak and indention.
For our use we had no use of the comInterfaceExternalProxyStub, so I deleted those entries. But leaving them in would do no harm I guess.
Create exe-manifest
Best illustrated with an example.
Here is our manifest for an app named Navi.exe that uses three dll's:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32" name="Navi.exe" version="1.0.0.0" />
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="ChilkatRsa.dll" version="9.3.1.0"/>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="ChilkatCrypt2.dll" version="9.3.0.0"/>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="ChilkatCert.dll" version="9.3.0.0"/>
</dependentAssembly>
</dependency>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!--The ID below indicates application support for Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!--The ID below indicates application support for Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
</application>
</compatibility>
</assembly>
You will need to replace application/dll name and version.
The last section: compability says that our application is compatible with Vista and Win7
To run your application using local dll's, the exe, dll's and it's corresponding manifests needs to be in the same folder.
If you are writing your application in delphi you could add the exe-manifest in the exe by creating a resource file: appname.RC
With the following line: 1 24 "appname.exe.manifest"
And then compile the RC: brcc32 appname.RC
You should then have a appname.RES that you would have to include in your project. I guess you already have a "{$R *.res}" line in your dpr-file. If so it would be included in your exe, the next time you compile your project.
I sometimes get conflict with the apps icon that delphi tries to put in the same res-file. So if your app is missing the icon after adding the manifest. Try adding it to the project again, I have not found out when it gives me a conflict and when it doesn't...
Ove B-) |
|
--Emner: Delphi, Utvikling
|
|
|
Laste ned passordbeskyttet fil med VBA |
Av: Ove Halseth |
Fredag 11.05.2012 (14:44) |
Fant fort ut at en kunne laste ned vanlig fil med denne koden fra www.cpearson.com
Option Explicit
Option Compare Text
Public Enum DownloadFileDisposition
OverwriteKill = 0
OverwriteRecycle = 1
DoNotOverwrite = 2
PromptUser = 3
End Enum
Private Declare Function SHFileOperation Lib "shell32.dll" Alias _
"SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
Private Declare Function PathIsNetworkPath Lib "shlwapi.dll" _
Alias "PathIsNetworkPathA" ( _
ByVal pszPath As String) As Long
Private Declare Function GetSystemDirectory Lib "kernel32" _
Alias "GetSystemDirectoryA" ( _
ByVal lpBuffer As String, _
ByVal nSize As Long) As Long
Private Declare Function SHEmptyRecycleBin _
Lib "shell32" Alias "SHEmptyRecycleBinA" _
(ByVal hwnd As Long, _
ByVal pszRootPath As String, _
ByVal dwFlags As Long) As Long
Private Const FO_DELETE = &H3
Private Const FOF_ALLOWUNDO = &H40
Private Const FOF_NOCONFIRMATION = &H10
Private Const MAX_PATH As Long = 260
Private Type SHFILEOPSTRUCT
hwnd As Long
wFunc As Long
pFrom As String
pTo As String
fFlags As Integer
fAnyOperationsAborted As Boolean
hNameMappings As Long
lpszProgressTitle As String
End Type
Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
"URLDownloadToFileA" ( _
ByVal pCaller As Long, _
ByVal szURL As String, _
ByVal szFileName As String, _
ByVal dwReserved As Long, _
ByVal lpfnCB As Long) As Long
Public Function DownloadFile(UrlFileName As String, _
DestinationFileName As String, _
Overwrite As DownloadFileDisposition, _
ErrorText As String) As Boolean
Dim Disp As DownloadFileDisposition
Dim Res As VbMsgBoxResult
Dim B As Boolean
Dim S As String
Dim L As Long
ErrorText = vbNullString
If Dir(DestinationFileName, vbNormal) <> vbNullString Then
Select Case Overwrite
Case OverwriteKill
On Error Resume Next
Err.Clear
Kill DestinationFileName
If Err.Number <> 0 Then
ErrorText = "Error Kill'ing file '" & DestinationFileName & "'." & vbCrLf & Err.Description
DownloadFile = False
Exit Function
End If
Case OverwriteRecycle
On Error Resume Next
Err.Clear
B = RecycleFileOrFolder(DestinationFileName)
If B = False Then
ErrorText = "Error Recycle'ing file '" & DestinationFileName & "." & vbCrLf & Err.Description
DownloadFile = False
Exit Function
End If
Case DoNotOverwrite
DownloadFile = False
ErrorText = "File '" & DestinationFileName & "' exists and disposition is set to DoNotOverwrite."
Exit Function
'Case PromptUser
Case Else
S = "The destination file '" & DestinationFileName & "' already exists." & vbCrLf & _
"Do you want to overwrite the existing file?"
Res = MsgBox(S, vbYesNo, "Download File")
If Res = vbNo Then
ErrorText = "User selected not to overwrite existing file."
DownloadFile = False
Exit Function
End If
B = RecycleFileOrFolder(DestinationFileName)
If B = False Then
ErrorText = "Error Recycle'ing file '" & DestinationFileName & "." & vbCrLf & Err.Description
DownloadFile = False
Exit Function
End If
End Select
End If
L = URLDownloadToFile(0&, UrlFileName, DestinationFileName, 0&, 0&)
If L = 0 Then
DownloadFile = True
Else
ErrorText = "Buffer length invalid or not enough memory."
DownloadFile = False
End If
End Function
Private Function RecycleFileOrFolder(FileSpec As String) As Boolean
Dim FileOperation As SHFILEOPSTRUCT
Dim lReturn As Long
If (Dir(FileSpec, vbNormal) = vbNullString) And _
(Dir(FileSpec, vbDirectory) = vbNullString) Then
RecycleFileOrFolder = True
Exit Function
End If
With FileOperation
.wFunc = FO_DELETE
.pFrom = FileSpec
.fFlags = FOF_ALLOWUNDO
.fFlags = FOF_ALLOWUNDO + FOF_NOCONFIRMATION
End With
lReturn = SHFileOperation(FileOperation)
If lReturn = 0 Then
RecycleFileOrFolder = True
Else
RecycleFileOrFolder = False
End If
End Function
Men ingen enkel måte og laste ned en passordbeskyttet fil:-(
Løsningen er snublende nær, det er bare og laste ned med url'en: http://brukernavn:passord@site.no
Ove B-) |
|
--Emner: Utvikling, VBA
|
|
|
Bare si "Nei til alt" |
Av: Ove Halseth |
Mandag 12.12.2011 (11:48) |
Er nok mange fler enn meg som har undret seg over valgene en får ved filkopiering i windows.
Når du får beskjed om at filen finnes fra før så får du spørsmål om og overskrive fil og følgende valg:
[Ja] [Ja til alt] [Nei] [Avbryt]
Her mangler det helt klart ett valg: [Nei til alt]
Jeg er nok ikke den eneste som har klikket [Ja til alt] bare fordi en ikke orker og sitte og klikke [Nei] [Nei] [Nei] [Nei] [Nei] [Nei] [Nei] [Nei] [Nei]
Men jeg snublet over løsningen når jeg surfet innom bloggen til IdiotProgrammer
Hold ned Shift og klikk [Nei] og windows tolker det som [Nei til alt]!
Ove B-)
PS: Like etter at jeg fant denne så fant jeg også det utmerkede programmet TeraCopy som kopiere filer slik det skal gjøres...
|
|
--Emner: Operativsystem, Windows
|
|
|
Posten er slettet - ved innsetting av nye poster |
Av: Ove Halseth |
Onsdag 16.11.2011 (08:36) |
Når en kjører insert spørringer hvor dataene hentes fra ODBC tabeller så kan en snuble over denne feilen:
Microsoft Office Access -Posten er slettet
Løsningen min tidligere var og hente inn dataene i en ny tabell i access, og så bruke den tabellen for å opprette nye poster.
Men så oppdaget jeg denne settingen på egenskapssiden til spørringen:
Og nøkkelverdien her er Entydige verdier, for om en endrer denne til Ja så kjører spørringen helt fint!
Nok ett tilfelle som støtter opp om teorien min:
For enhver feilmelding så er det en hake begravd ett eller annet sted i instillingene som skulle ha vært huket av.
Ove B-) |
|
--Emner: Access, Database/SQL
|
|
|
Liste over norske stoppord |
Av: Ove Halseth |
Onsdag 20.04.2011 (08:37) |
Bør jo være en grei sak og finne liste over norske stoppord tenkte jeg og skulle ta bare en kjapp tur innom Google....
Men nei:-(
Fant mange artikler om emnet, men ingen liste.
Ikke før jeg som ett siste forsøk sjekket om dette var noe utlendingene var interessert i.
For Norwegian stopwords resulterte i flere matnyttige sider!
Her er resultatet, en kombinert bokmål/nynorskliste, med de særegne nynorskorda nederst:
alle
andre
at
av
bare
begge
ble
bli
blir
blitt
bort
bra
bruke
både
da
de
deg
dem
den
denne
der
dere
deres
det
dette
din
disse
dit
ditt
du
eller
en
ene
eneste
enhver
enn
er
et
ett
etter
for
fordi
forsøke
fra
fram
før
først
få
gjorde
gjøre
god
gå
ha
hadde
han
hans
har
hennar
henne
hennes
her
hit
hun
hva
hvem
hver
hvilke
hvilken
hvis
hvor
hvordan
hvorfor
i
ikke
ingen
inn
innen
inni
ja
jeg
kan
kom
kun
kunne
lage
lang
lik
like
man
mange
med
meg
meget
mellom
men
mens
mer
mest
min
min
mitt
mot
mye
må
måte
ned
nei
noe
noen
ny
nå
når
og
også
om
opp
oss
over
på
rett
riktig
samme
seg
selv
si
siden
sin
sine
sist
sitt
sjøl
skal
skulle
slik
slutt
som
start
stille
så
sånn
tid
til
tilbake
under
ut
uten
var
ved
verdi
vi
vil
ville
vite
være
vært
vår
å
blei
båe
dei
deim
deira
deires
di
dykk
dykkar
då
eg
ein
eit
eitt
elles
hjå
ho
hoe
honom
hoss
hossen
ikkje
ingi
inkje
korleis
korso
kva
kvar
kvarhelst
kven
kvi
kvifor
me
medan
mi
mine
mykje
no
noka
noko
nokon
nokor
nokre
si
sia
sidan
so
somme
somt
um
upp
vart
varte
vere
verte
vore
vors
vort
Ove B-) (med fare for å havne som stoppord) |
|
--Emner: Database/SQL, Sybase
|
|
|
VBA UrlEncode |
Av: Ove Halseth |
Lørdag 30.10.2010 (22:43) |
I ett prosjekt så hadde vi behov for å poste en url. Problemet var bare at æøå rotet til alt på serversiden, og vi fikk ikke ut parametrene.
Etter litt googling så fant vi fort diverse varianter av UrlEncode, deriblandt en versjon som skulle støtte UTF-8:
http://stackoverflow.com/questions/218181/how-can-i-url-encode-a-string-in-excel-vba
Men vi kom ikke helt i mål, for vi fikk ikke konverteringen til UTF-8 til å virke:-( Nytt dykk i google kom opp med:
http://www.codenewsgroups.net/vb/t13396-widechartomultibyte-utf-8.aspx
Som ga oss konvertering til UTF-8.
Resultatet ble:
Private Declare Function WideCharToMultiByte Lib "Kernel32.dll" ( _
ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, _
ByVal cchWideChar As Long, ByVal lpMultiByteStr As String, ByVal cbMultiByte As Long, _
ByVal lpDefaultChar As String, ByRef lpUsedDefaultChar As Long) As Long
Private Declare Function MultiByteToWideChar Lib "Kernel32.dll" ( _
ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, _
ByVal cbMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Const CP_UTF8 As Long = 65001 ' UTF-8 translation
Public Function ToUTF8(ByRef inString As String) As String
Dim BufLen As Long
BufLen = WideCharToMultiByte(CP_UTF8, 0&, ByVal StrPtr(inString), _
Len(inString), vbNullString, 0&, vbNullString, ByVal 0&)
If (BufLen > 0) Then
ToUTF8 = Space$(BufLen)
Call WideCharToMultiByte(CP_UTF8, 0&, ByVal StrPtr(inString), _
Len(inString), ToUTF8, BufLen, vbNullString, ByVal 0&)
End If
End Function
Public Function FromUTF8(ByRef inString As String) As String
Dim BufLen As Long
BufLen = MultiByteToWideChar(CP_UTF8, 0&, inString, -1, 0&, 0&)
If (BufLen > 0) Then
FromUTF8 = Space$(BufLen)
BufLen = MultiByteToWideChar(CP_UTF8, 0&, inString, _
Len(inString), ByVal StrPtr(FromUTF8), BufLen)
FromUTF8 = Left$(FromUTF8, BufLen) ' Trim null
End If
End Function
Public Function UrlEncode( _
StringVal As String, _
Optional SpaceAsPlus As Boolean = False, _
Optional UTF8Encode As Boolean = True _
) As String
Dim StringValCopy As String
Dim StringLen As Long
StringValCopy = IIf(UTF8Encode, ToUTF8(StringVal), StringVal)
StringLen = Len(StringValCopy)
If StringLen > 0 Then
ReDim Result(StringLen) As String
Dim I As Long, CharCode As Integer
Dim Char As String, Space As String
If SpaceAsPlus Then Space = "+" Else Space = "%20"
For I = 1 To StringLen
Char = Mid$(StringValCopy, I, 1)
CharCode = Asc(Char)
Select Case CharCode
Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126
Result(I) = Char
Case 32
Result(I) = Space
Case 0 To 15
Result(I) = "%0" & Hex(CharCode)
Case Else
Result(I) = "%" & Hex(CharCode)
End Select
Next I
UrlEncode = Join(Result, "")
End If
End Function
'From http://stackoverflow.com/questions/218181/how-can-i-url-encode-a-string-in-excel-vba
Public Function UrlEncode( _
StringVal As String, _
Optional SpaceAsPlus As Boolean = False, _
Optional UTF8Encode As Boolean = True _
) As String
Dim StringValCopy As String
Dim StringLen As Long
StringValCopy = IIf(UTF8Encode, ToUTF8(StringVal), StringVal)
StringLen = Len(StringValCopy)
If StringLen > 0 Then
ReDim Result(StringLen) As String
Dim I As Long, CharCode As Integer
Dim Char As String, Space As String
If SpaceAsPlus Then Space = "+" Else Space = "%20"
For I = 1 To StringLen
Char = Mid$(StringValCopy, I, 1)
CharCode = Asc(Char)
Select Case CharCode
Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126
Result(I) = Char
Case 32
Result(I) = Space
Case 0 To 15
Result(I) = "%0" & Hex(CharCode)
Case Else
Result(I) = "%" & Hex(CharCode)
End Select
Next I
UrlEncode = Join(Result, "")
End If
End Function
Ove B-)
|
|
--Emner: Access, Utvikling, VBA
|
|
|
Kan ikke slette i de angitte tabellene |
Av: Ove Halseth |
Mandag 23.08.2010 (07:22) |
Ofte når jeg støter på problemer i Windows så har jeg på følelsen av at det finns sikkert en sjekkboks for dette problemet ett sted.
Problemet er bare og finne ut hva sjekkboksen heter og hvor den er gjemt.
Grunnen til at du leser denne bloggen er kanskje fordi du har støtt borti denne feilmeldingen i MSAccess:
"Kan ikke slette i de angitte tabellene"
Da har jeg en god nyhet! Om ikke en sjekkboks så fins det en setting som "slår av" denne feilmeldingen.
- Når du har spørringen fremme, så trykk Alt-Enter for å få frem egenskapssiden til spørringen.
- Her setter du Entydige poster til Ja.
Entydige poster er altså navnet på dette problemets hake...
Løsningen ble funnet hos Microsoft kundestøtte! Etter litt googling.
Mvh
Ove B-) |
|
--Emner: Access, Database/SQL, Utvikling
|
|
|
Microsoft Security Essentials - Antivirus fra MS |
Av: Ove Halseth |
Tirsdag 17.08.2010 (10:37) |
Microsoft sitt fremstøt på antivirus fronten: Microsoft Security Essentials(MSE) har fått bra kritikk, og kommet bra ut i sammenligninger med andre antivirus program. Faktisk helt i toppen blandt Kaspersky og ESET i første test etter at det ble sluppet.
Men hovedpoenget med og bytte fra f.eks AVG til MSE et at en slipper alt maset om oppgraderinger og oppdateringer. Og er en data-guru i venneflokken, så kan en gange det maset med antall venner:-)
Av en eller annen grunn så har MS funnet ut at en bare skal få lov til å installere MSE i USA!
Men denne linken lar deg installere MSE også her i grisgrendte strøk.
Microsoft Security Essentials - download
Ove B-) |
|
--Emner: Windows
|
|
|
Retilkobling av tabeller i Access |
Av: Ove Halseth |
Mandag 03.05.2010 (12:53) |
I en god del access prosjekt så benytter vi to databaser, en front og en database.
Problemet er ofte at databasene får forskjellig sti hos oss og hos kunden. Noe som gjør at en må knytte opp tabellene på nytt.
Tidligere benyttet vi denne koden:
For Each Tdf In CurrentDb.TableDefs
If Tdf.Connect <> "" Then
strTable = Tdf.Name
CurrentDb.TableDefs(strTable).Connect = ";DATABASE=<sti>\<backenddb>.mdb"
CurrentDb.TableDefs(strTable).RefreshLink '(Denne gir feilmelding)
End If
Next
Men den feiler nå på .RefreshLink, og feilen er at en ikke får satt .Connect til ny sti.
Løsningen var og slette koblingen og opprette den på nytt:
For Each Tdf In CurrentDb.TableDefs
If Tdf.Connect <> "" Then
strTable = Tdf.Name
CurrentDb.TableDefs.Delete strTable
Set td = CurrentDb.CreateTableDef(strTable, dbAttachSavePWD, strTable, ";DATABASE=<sti>\<backenddb>.mdb")
CurrentDb.TableDefs.Append td
End If
Next
Ove B-) |
|
--Emner: Access, VBA
|
|
|
|
|