Sometimes the functions that are built into UNIFACE just don't do the job, so developers want to access some of the functions that are available within the Windows operating system. These are known as Application Program Interfaces, or API's for short. With UNIFACE Seven and above this is relatively simple to do provided that you have the following:-
This article describes some of the Windows API's that I have used, and their signatures are available in an export file which can be downloaded from here. This contains a single component called "winapi" which has a separate operation for each API. Note that you also have to update the [userdlls] section in your usys.ini file in order to point to the Windows DLL file that contains each API.
This will copy a file.
This requires the "CopyFile" API which resides in kernel32.dll. The calling sequence is as follows:-
COPYFILE (string from, string to, boolean failifexists) lv_fromfile = "test1.txt" lv_tofile = "test2.txt" lv_failifexists = "T" or "F" activate "winapi".copyfile(lv_fromfile,lv_tofile,lv_failifexists) ($status: 0=fail, >0=success)
This will delete a file.
This requires the "DeleteFile" API which resides in kernel32.dll. The calling sequence is as follows:-
DELETEFILE (string file) activate "winapi".deletefile(lv_filename) ($status: 0=fail, >0=success)
This obtains from the system registry the name of the application which is associated with a particular file extension.
This requires the "FindExecutable" API which resides in shell32.dll. The calling sequence is as follows:-
FINDEXECUTABLE (string file, string defaultdirectory, string result) lv_File = "test.html" lv_Directory = "" ; note that lv_Program must be pre-initialised with spaces lv_Program = " " activate "winapi".findexecutable(lv_file,lv_directory,lv_Program) (lv_Program now contains "C:\PROGRA~1\INTERN~1\iexplore.exe")
This obtains the name of the current working directory.
This requires the "GetCurrentDirectory" API which resides in kernel32.dll. The calling sequence is as follows:-
GETCURRENTDIRECTORY (numeric buflen, string path) ; note that lv_directory must be pre-initialised with spaces lv_directory = " " activate "winapi".getcurrentdirectory(128, lv_directory) (lv_directory now contains "F:\UNIFACE\7206\sample")
This converts a relative path name into a full path name.
This requires the "GetFullPathName" API which resides in kernel32.dll. The calling sequence is as follows:-
GETFULLPATHNAME (string filename, numeric buflen, string buffer, numeric filepart) lv_filename = "test.html" ; note that lv_FullPath must be pre-initialised with spaces lv_FullPath = " " activate "winapi".getfullpathname(lv_filename, 128, lv_FullPath, 0) (lv_fullpath now contains "F:\UNIFACE\7206\sample\test.html")
This will retrieve a string from a Windows INI file.
This requires the "GetIniString" API which resides in kernel32.dll. The calling sequence is as follows:-
GETINISTRING (string section, string keyname, string default, string returnstring, numeric size) file HTMLHELP.INI contains: [htmlhelp] test1=test-one.htm test2=test-two.htm#two lv_Section = "HTMLHELP" lv_keyname = "test1" lv_filename = ".\htmlhelp.ini" ; note that lv_string must be pre-initialised with spaces lv_string = " " lv_length = 40 lv_default = "default" activate "winapi".getinistring(lv_Section %\ ,lv_keyname %\ ,lv_Default %\ ,lv_string %\ ,lv_length %\ ,lv_filename) (lv_string now contains "test-one.htm"
This retrieves the username from the Windows logon.
This requires the "GetUserName" API which resides in advapi32.dll. The calling sequence is as follows:-
GETUSERNAME (string name, numeric size) ; note that lv_UserName must be pre-initialised with spaces lv_UserName = " " lv_BufLen = 20 activate "winapi".getusername(lv_UserName, lv_BufLen) (lv_UserName now contains "AJM")
This simulates the act of double-clicking on a file.
This requires the "ShellExecute" API which resides in shell32.dll. The calling sequence is as follows:-
SHELLEXECUTE (numeric handle, string verb, string file, string parameters, string directory, numeric noshowcmd) lv_filename = "http://www.marston-home.demon.co.uk" activate "winapi".shellexecute(0,"",lv_filename,"","",1) (will open a browser window at that URL) lv_filename = "something.doc" activate "winapi".shellexecute(0,"",lv_filename,"","",1) (will open that file using the registered word processor)
This will open a dialog box which allows the user to select a folder rather than a file.
This requires the "SHBrowseForFolder" and "SHGetPathFromIdList" API's which resides in shell32.dll. The calling sequence is as follows:-
SHBROWSEFORFOLDER (numeric pid) SHGETPATHFROMIDLIST (numeric pid, string foldername) activate "winapi".browseforfolder(lv_pointer) ($status now contains pathid) activate "winapi".getpathfromidlist($status, lv_foldername) (lv_foldername now contains the name of the chosen folder)
If anyone has other API signatures that they would like added to this collection please let me know.
Tony Marston
1st May 2003
mailto:tony@tonymarston.net
mailto:TonyMarston@hotmail.com
http://www.tonymarston.net