disphelper

Disphelper is a COM helper library that can be used in plain C. No MFC or 
ATL is required. It allows you to call COM objects with an easy printf 
style syntax.

Website: http://disphelper.sourceforge.net/
Platforms supported: Win32, Linux (using WINE)
Headers to include: disphelper/disphelper.bi
Header version: from 2005

Example
	'' HTTP GET example, using MSXML2

	#define UNICODE
	#include "disphelper/disphelper.bi"

	DISPATCH_OBJ(objHTTP)

	dhInitialize(True)
	dhToggleExceptions(True)

	dhCreateObject("MSXML2.XMLHTTP.4.0", NULL, @objHTTP)

	dhCallMethod(objHTTP, ".Open(%s, %s, %b)", "GET", "http://sourceforge.net", False)
	dhCallMethod(objHTTP, ".Send")

	Dim As ZString Ptr szResponse
	dhGetValue("%s", @szResponse, objHTTP, ".ResponseText")

	Print "Response: "; *szResponse
	dhFreeString(szResponse)

	SAFE_RELEASE(objHTTP)
	dhUninitialize(True)

	'' IExplorer example

	#define UNICODE
	#include "disphelper/disphelper.bi"

	Sub navigate(ByRef url As String)
	   DISPATCH_OBJ(ieApp)
	   dhInitialize(True)
	   dhToggleExceptions(True)

	   dhCreateObject("InternetExplorer.Application", NULL, @ieApp)
	   dhPutValue(ieApp, "Visible = %b", True)
	   dhCallMethod(ieApp, ".Navigate(%s)", url)

	   SAFE_RELEASE(ieApp)
	   dhUninitialize(True)
	End Sub

	   navigate("www.freebasic.net")

	'' VB Script example

	#define UNICODE
	#include "disphelper/disphelper.bi"

	'' This function runs a script using the MSScriptControl.
	'' Optionally returns a result.
	Sub RunScript _
	   ( _
	      ByVal result_identifier As LPWSTR, _
	      ByVal result As LPVOID, _
	      ByVal script As LPWSTR, _
	      ByVal language As LPWSTR _
	   )

	   DISPATCH_OBJ(control)
	   If (SUCCEEDED(dhCreateObject("MSScriptControl.ScriptControl", NULL, @control))) Then
	      If (SUCCEEDED(dhPutValue(control, ".Language = %T", language))) Then
	         dhPutValue(control, ".AllowUI = %b", True)
	         dhPutValue(control, ".UseSafeSubset = %b", False)

	         If (result) Then
	            dhGetValue(result_identifier, result, control, ".Eval(%T)", script)
	         Else
	            dhCallMethod(control, ".Eval(%T)", script)
	         End If
	      End If
	   End If

	   SAFE_RELEASE(control)
	End Sub

	   dhInitialize(True)
	   dhToggleExceptions(True)

	   '' VBScript sample
	   RunScript(NULL, NULL, !"MsgBox(\"This Is a VBScript test.\" & vbcrlf & \"It worked!\",64 Or 3)", "VBScript")

	   '' JScript sample
	   Dim As Integer result
	   RunScript("%d", @result, "Math.round(Math.pow(5, 2) * Math.PI)", "JScript")
	   Print "Result ="; result

	   Print "Press any key to exit..."
	   Sleep

	   dhUninitialize(True)

