Platforms to show: All Mac Windows Linux Cross-Platform
/Util/softDeclares/SoftDeclare
Required plugins for this example: MBS MacOSX Plugin, MBS Util Plugin, MBS MacCF Plugin
You find this example project in your Plugins Download as a Xojo project file within the examples folder: /Util/softDeclares/SoftDeclare
This example is the version from Thu, 31th Jul 2019.
Project "SoftDeclare.xojo_binary_project"
Class Window1 Inherits Window
Control ListBox1 Inherits ListBox
ControlInstance ListBox1 Inherits ListBox
End Control
EventHandler Sub Open()
TestConstant
TestDYLIB
TestFramework
TestLinux
TestSpeech
TestWindows
End EventHandler
Protected Sub TestConstant()
if TargetCarbon then
dim c as SoftDeclareMBS
dim s as CFStringMBS
dim m as MemoryBlock
// Test Mac OS X
// Load the constant kABFirstNameProperty from the Addressbook framework
w "Testing constant loading with Mac OS X Framework"
c=new SoftDeclareMBS
if c.loadlibrary("Addressbook.framework") then
w "Loaded "+c.libname+" to "+format(c.libhandle,"-0")+"."
if c.LoadConstant("kABFirstNameProperty") then
w "Loaded constant "+c.ConstantName+" to "+format(c.ConstantPointer,"-0")+"."
m=NewMemoryBlockFromPtrMBS(c.ConstantPointer) // I hope it's not nil!
s=new CFStringMBS
s.Handle=m.Long(0)
s.RetainObject
if s=nil then
w "The constant is not a CFString!?"
else
w "Got value: "+s.str
end if
s=nil
m=nil
else
w "Loading of constant "+c.ConstantName+" failed."
end if
else
w "Loading of "+c.libname+" failed."
end if
c=nil
end if
End Sub
Protected Sub TestDYLIB()
dim s as SoftDeclareMBS
dim m as MemoryBlock
w "Testing dylib loading on Mac OS X"
s=new SoftDeclareMBS
// void *malloc(size_t size);
if s.LoadDylib("/usr/lib/libc.dylib") then
if s.LoadFunction("malloc") then
m=NewMemoryBlock(4)
m.Long(0)=100000000 // you see this 100 MB allocation in Activity Monitor
if s.CallFunction(1,m) then
w "Success on malloc: "+hex(s.Result)
else
w "Failed on calling function."
end if
else
w "Failed on loading function."
end if
else
w "Failed on loading library."
end if
End Sub
Protected Sub TestFramework()
dim c as SoftDeclareMBS
w "Testing framework loading on Mac OS X"
// Test Mac OS X
c=new SoftDeclareMBS
if c.LoadFramework("AppleShareClient.framework") then
w "Loaded "+c.libname+" to "+format(c.libhandle,"-0")+"."
if c.loadfunction("AFPLibraryVersion") then
w "Loaded function "+c.FunctionName+" to "+format(c.functionPointer,"-0")+"."
if c.CallFunction(0,nil) then
w "Calling returned "+hex(c.result)
else
w "Failed to call function."
end if
else
w "Loading of function "+c.FunctionName+" failed."
end if
else
w "Loading of "+c.libname+" failed."
end if
End Sub
Protected Sub TestLinux()
dim s as SoftDeclareMBS
dim m as MemoryBlock
w "Testing lib loading on Linux"
s=new SoftDeclareMBS
// void *malloc(size_t size);
if s.LoadLibrary("libc.so.6") then
if s.LoadFunction("malloc") then
m=NewMemoryBlock(4)
m.Long(0)=100000000 // you see this 100 MB allocation in Activity Monitor
if s.CallFunction(1,m) then
w "Success on malloc: "+hex(s.Result)
else
w "Failed on calling function."
end if
else
w "Failed on loading function. "
end if
else
w "Failed on loading library. "+s.Liberror
end if
End Sub
Protected Sub TestSpeech()
dim p,m as MemoryBlock
dim name as string
dim c as SoftDeclareMBS
c=new SoftDeclareMBS
w "Testing carbon library loading on Mac OS"
// make the string for the first parameter
p=newmemoryBlock(256)
p.pstring(0)="Hello World!"
// make the memoryblock for the parameters
m=newmemoryBlock(4)
m.long(0)=p.AddressMBS(0) // set the first parameter to the address of the string buffer
// Which library to call?
if Targetcarbon then
if RunningOnCarbonXMBS then
name="Carbon.framework"
else
name="CarbonLib" // for Carbon inside Classic
end if
else
name="SpeechLib"
end if
// Load librarys
if c.loadlibrary(name) then
w "Loaded "+c.libname+" to "+format(c.libhandle,"-0")+"."
// Load function
if c.loadfunction("SpeakString") then
w "Loaded function "+c.FunctionName+" to "+format(c.functionPointer,"-0")+"."
// Call function
if c.CallFunction(1,m) then
w "Calling returned "+hex(c.result) // result doesn't matter, but here is it.
else
w "Failed to call function."
end if
else
w "Loading of function "+c.FunctionName+" failed."
end if
else
w "Loading of "+c.libname+" failed."
end if
End Sub
Protected Sub TestWindows()
if TargetWin32 then
dim f as FolderItem
dim p,m,b as MemoryBlock
dim c as SoftDeclareMBS
dim path as string
// For Windows, we try GetShortPathName which can't be hard declared because it's not available on Windows NT 4 SP 6
// (This was a bug to hard link it to MBS Plugin 2.5, so I fixed this for MBS Plugin 2.6)
// DWORD GetShortPathNameA(IN LPCSTR lpszLongPath,OUT LPSTR lpszShortPath, IN DWORD cchBuffer);
w "Testing DLL loading on Windows"
c=new SoftDeclareMBS
f=ApplicationsFolderMBS(-32766) // get a folder...
path=f.NativePath
b=newmemoryBlock(1024)
b.long(0)=0 // make emptry C string
p=newmemoryBlock(lenb(path)+10)
p.cstring(0)=path
m=newmemoryBlock(12+10)
m.long(0)=p.AddressMBS(0)
m.long(4)=b.AddressMBS(0)
m.long(8)=b.size-1
if c.loadlibrary("KERNEL32") then
w "Loaded "+c.libname+" to "+format(c.libhandle,"-0")+"."
if c.loadfunction("GetShortPathNameA") then
w "Loaded function "+c.FunctionName+" to "+format(c.functionPointer,"-0")+"."
if c.CallFunction(3,m) then
w "Calling returned "+hex(c.result)
w "Short path is: "+b.cstring(0)
else
w "Failed to call function."
end if
else
w "Loading of function "+c.FunctionName+" failed."
end if
else
w "Loading of "+c.libname+" failed."
end if
end if
End Sub
Sub w(s as string)
listBox1.addrow s
End Sub
End Class
MenuBar Menu
MenuItem UntitledMenu3 = ""
MenuItem UntitledMenu2 = "File"
MenuItem FileQuit = "Quit"
MenuItem UntitledMenu0 = "Edit"
MenuItem EditUndo = "Undo"
MenuItem UntitledMenu1 = "-"
MenuItem EditCut = "Cut"
MenuItem EditCopy = "Copy"
MenuItem EditPaste = "Paste"
MenuItem EditClear = "Clear"
End MenuBar
Class App Inherits Application
End Class
End Project
See also:
The items on this page are in the following plugins: MBS Util Plugin.