Using WIN32 DLLs in Avenue

If you go to ArcView's online help contents and navigate to "Customizing and programming ArcView with Avenue", "Creating an ArcView Application", "Integrating ArcView with other applications", "Dynamic link libraries (DLL)", "Using Microsoft DLLs" , you'll find a discussion of calling WIN32 API functions using ArcView's DLL and DLLProc Classes.

Here are three potentially useful examples: "getsysd.ave" retrieves the Windows System directory, "mkdir.ave" makes a unique temporary directory under the $TEMP directory, and "rmdir.ave" removes an existing (empty) directory.

getsysd.ave:

dllName = FileName.FindInSystemSearchPath("kernel32.dll")
u32DLL = DLL.Make(dllName)
GetSysDir = DLLProc.Make(u32DLL,"GetSystemDirectoryA",#DLLPROC_TYPE_INT32,
   {#DLLPROC_TYPE_STR,#DLLPROC_TYPE_INT32})
strSysDir = String.MakeBuffer(260)
result = GetSysDir.Call({strSysDir,260})
if (result = 0) then
   strSysDir = "ERROR"
end
return strSysDir

mkdir.ave:

thePrefix = Self.Get(0)
dllName = FileName.FindInSystemSearchPath("kernel32.dll")
u32DLL = DLL.Make(dllName)
MkDir = DLLProc.Make(u32DLL,"CreateDirectoryA",#DLLPROC_TYPE_INT32,
   {#DLLPROC_TYPE_STR,#DLLPROC_TYPE_VOID})
strNewDir = FileName.GetTmpDir.MakeTmp(thePrefix,"").GetFullName
strSecAtt = ""
result = MkDir.Call({strNewDir,strSecAtt})
if (result = 0) then
   strNewDir = "ERROR"
end
return strNewDir

rmdir.ave:

strRmDir = SELF.Get(0)
success = true
dllName = FileName.FindInSystemSearchPath("kernel32.dll")
u32DLL = DLL.Make(dllName)
MkDir = DLLProc.Make(u32DLL,"RemoveDirectoryA",#DLLPROC_TYPE_INT32,
   {#DLLPROC_TYPE_STR})
result = MkDir.Call({strRmDir})
if (result = 0) then
   success = false
end
return success
Remember that Avenue cannot handle all types of data structures. For example, the second argument of "CreateDirectoryA" is a SECURITY_ATTRIBUTES structure. Fortunately, for this particular function the second argument is optional and NULL may be passed instead.

For an in-depth discussion of the Win32 API (a.k.a. "Platform SDK"), you can purchase the MSDN Library CD-ROM (free with Visual Basic or C++ pro editions), or one of several books available on the market. A list of the Win32 API declarations for Visual Basic may be downloaded at:

http://www.microsoft.com/officedev/o-free.htm

Finally, the following example doesn't use DLL calls. It's just a reminder that you can use ReadFiles to find and remove files in a directory.

rmfiles.ave:

strRmDir = SELF.Get(0)
success = true
for each fnm in strRmDir.AsFileName.ReadFiles("*.*")
   if (File.CanDelete(fnm)) then
      File.Delete(fnm)
   else
      success = false
   end
end
return success

Back to AVTips