example of how to build juno with DMD1.016

yidabu yidabu.nospam at gmail.com
Wed Jun 20 21:15:44 PDT 2007


example of how to build juno with DMD1.016

from D china:
http://bbs.yidabu.com/forum-10-1.html
http://bbs.yidabu.com/thread-619-1.html


download juno

	download juno from:
	http://www.dsource.org/projects/juno

	put to:\dmd\src\other\juno.

compile juno and find errors

	use DSSS to compile juno
	\dmd\src\other\dsss.conf:
	
		[*]
		buildflags=-g -O -debug
		[juno]
		type=library
	
	note:without -O switch, will cause Stack Overflow.

	\dmd\src\other\build.bat:
	
		dsss build juno
		pause
	


modified files

	run build.bat, will cause a lot of errors, fixed errors:

	1 com.reflect.d

	line 822,delete override.
	line 155,change ref to nref,
	in editor scite,search
	
		([^\w])ref
	
	replaced with:
	
		\1nref
	


	2 xml.core.d

	line,162, changed to:
	pcbRead = stream_.readBlock(cast(void*)buffer, cb);
	line 163, changed to:
	std.c.string.memcpy(pv, cast(void*)buffer, cb);
	line,237, changed to:
	std.c.string.memcpy(cast(void*)buffer, pv, cb);
	line 238, changed to:
	pcbWritten = stream_.writeBlock(cast(void*)buffer, cb);

	3 com.core.d

	line 1623, changed ref to nref,searh and replace in file.
	line 1604, changed to:
	*ppvObject = cast(void*)(cast(IUnknown)this);
	line 1607:
	*ppvObject =cast(void*)(cast(T[i])this);
	line 1640,1641:
	std.gc.removeRange(cast(void*)this);
	std.c.stdlib.free(cast(void*)this);
	line 554:
	v.byref = cast(void*)value,
	line 1590:
	uint r = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, null, error, 0, buffer.ptr, buffer.length + 1, null);
	line 1592:
	return juno.base.string.toUtf8(buffer.ptr,0, r - 1);
	line,1983:
	char[] str = juno.base.string.toUtf8(bstr[0 .. len].ptr);

	4 xml.dom.d
	juno\xml\dom.d(60):Error: cannot create instance of abstract class XmlCDataSection
	I'm no idea of how to modify line 60,62,64,66,68,74,79,81,83,85,87,89,91.
	the simple solution is delete all "abstract",maybe some wrong here.

	5 io.core.d
	line 22 changed to:
	return readBlock(cast(void*)buffer, buffer.length);
	line 26:
	return writeBlock(cast(void*)buffer, buffer.length);
	line 172:
	uint len = GetConsoleTitle(buffer.ptr, buffer.length);

	6 intl.core.d
	line 96 changed to:
	int cch = LCIDToLocaleName(culture, buffer.ptr, buffer.length, 0);
	line 104:
	int cch = DownlevelLCIDToLocaleName(culture, buffer.ptr, buffer.length, 0);
	line 265 changed to:
	int cch = GetLocaleInfo(culture, field, buffer.ptr, buffer.length);
	line 279 changed to:
	int cch = GetGeoInfo(geoId, geoType, buffer.ptr, buffer.length, 0);
	line 285 changed to:
	int cch = GetCalendarInfo(culture, calendar, calType, buffer.ptr, buffer.length, null);
	line 326 changed to:
	int cch = GetLocaleInfo(culture, field, buffer.ptr, buffer.length);
	439,440 changed to:
	translated = MultiByteToWideChar(CP_UTF8, 0, pChars, length, result.ptr, cch);
	return result.ptr;
	line 1591,1600 changed to:
	return (juno.base.string.parse!(double)(s));
	4109,4110 changed to:
	wcscpy(tzi.StandardName.ptr, key.getStringValue("Std").toUTF16z());
	wcscpy(tzi.DaylightName.ptr, key.getStringValue("Dlt").toUTF16z());

	7 base.win32.d
	add import std.windws.charset.
	line 994 changed to:
	T func = cast(T)GetProcAddress(moduleHandle, std.windows.charset.toMBSz(entryPoint));
	line 1012 changed to:
	func = cast(T)GetProcAddress(moduleHandle, std.windows.charset.toMBSz(entryPointName));
	line 951 changed to
	uint r = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, null, error, 0, buffer.ptr, buffer.length + 1, null);


	8 utils.registry.d
	line 81,82 changed to:
	RegQueryValueEx(hkey_, name.toLPStr(), null, type, b.ptr, cb);
	char[] result = juno.base.string.toUtf8(b.ptr);
	96,97 changed to:
	RegQueryValueEx(hkey_, name.toLPStr(), null, type, b.ptr, cb);
	return expandEnvironmentVariables(juno.base.string.toUtf8(b.ptr));
	line 110 changed to
	RegQueryValueEx(hkey_, name.toLPStr(), null, type, b.ptr, cb);
	line 120 changed to
	result ~= juno.base.string.toUtf8(b[index .. pos].ptr);
	line 125 changed to
	result ~= juno.base.string.toUtf8(b.ptr,index, end);
	line 141 changed to
	RegQueryValueEx(hkey_, name.toLPStr(), null, type, b.ptr, cb);
	line 189 changed to
	RegSetValueEx(hkey_, name.toLPStr(), 0, REG_DWORD, value.ptr, value.length);
	218,line 219 changed to
	RegEnumKeyEx(hkey_, i, buffer.ptr, len, null, null, null, null);
	result[i] = juno.base.string.toUtf8(buffer.ptr);
	240,line 241 changed to
	RegEnumValue(hkey_, i, buffer.ptr, len, null, null, null, null);
	result[i] = juno.base.string.toUtf8(buffer.ptr);

	9 io.path.d
	151,152 changed to:
	GetTempPath(buffer.length, buffer.ptr);
	return getFullPath(juno.base.string.toUtf8(buffer.ptr));
	158,line 159 changed to
	GetTempFileName(path.toLPStr(), "tmp", 0, buffer.ptr);
	return juno.base.string.toUtf8(buffer.ptr);
	164,line 165 changed to
	SHGetFolderPath(Handle.init, cast(int)folder, Handle.init, 0, buffer.ptr);
	return juno.base.string.toUtf8(buffer.ptr);
	176,178,line 179 changed to
	PathCanonicalizeW(buffer.ptr, path.toLPStr());
	GetLongPathNameW(buffer.ptr, buffer.ptr, MAX_PATH);
	return juno.base.string.toUtf8(buffer.ptr);

	10 intl.format.d
	line 479 changed to:
	char* p = cast(char*)number.digits;
	line 643 changed to
	char* p = cast(char*)digits.ptr;
	line 915 changed to
	char* p = cast(char*)digits.ptr;
	line 1035 changed to
	char* p = cast(char*)number.digits;
	line 1099 changed to
	char* p = cast(char*)number.digits;
	line 1134 changed to
	char* p = cast(char*)number.digits;

	11 base.meta.d
	line 48 changed to:
	const char[] demangleType = newdemangleBasicType(s);
	add function(maybe some problem here):
	
		char[] newdemangleBasicType(char[] s) {
			if (s == "v") return "void";
			else	if (s == "x") return "bool";
			else	if (s == "g") return "byte";
			else	if (s == "h") return "ubyte";
			else	if (s == "s") return "short";
			else	if (s == "t") return "ushort";
			else	if (s == "i") return "int";
			else	if (s == "k") return "uint";
			else	if (s == "l") return "long";
			else	if (s == "m") return "ulong";
			else	if (s == "d") return "double";
			else	if (s == "f") return "float";
			else	if (s == "e") return "real";
			else	if (s == "o") return "ifloat";
			else	if (s == "p") return "idouble";
			else	if (s == "j") return "ireal";
			else	if (s == "a") return "char";
			else	if (s == "u") return "wchar";
			else	if (s == "w") return "dchar";
			return null;
		}
	

	12 com.client.d
	line 115 changed to:
	dispParams.rgvarg = cast(VARIANT*)varArgs;

	13 base.environment.d
	line 14 changed to:
	uint n = ExpandEnvironmentStrings(temp.toLPStr(), buffer.ptr, c);
	line 18 changed to:
	n = ExpandEnvironmentStrings(temp.toLPStr(), buffer.ptr, c);
	line 22 changed to
	int n = ExpandEnvironmentStrings(name.toLPStr(), buffer.ptr, c);
	line 26 changed to
	n = ExpandEnvironmentStrings(name.toLPStr(), buffer.ptr, c);
	line 28 changed to
	char[] result = juno.base.string.toUtf8(buffer.ptr);
	line 35 changed to
	int n = GetEnvironmentVariable(variable.toLPStr(), buffer.ptr, buffer.length);
	line 40 changed to
	n = GetEnvironmentVariable(variable.toLPStr(), buffer.ptr, buffer.length);
	line 42 changed to
	char[] result = juno.base.string.toUtf8(buffer.ptr);

	14 juno.base.test.d
	line 205-208 changed to:
	info.webName = juno.base.string.toUtf8(cp.wszWebCharset.ptr);
	info.headerName = juno.base.string.toUtf8(cp.wszHeaderCharset.ptr);
	info.bodyName = juno.base.string.toUtf8(cp.wszBodyCharset.ptr);
	info.description = juno.base.string.toUtf8(cp.wszDescription.ptr);
	line 616 changed to:
	ConvertINetString(&dwMode, CP_UTF8, codePage_, cast(ubyte*)chars.ptr, &charsLength, bytes.ptr, &bytesLength);
	line 630 changed to:
	ConvertINetString(&dwMode, codePage_, CP_UTF8, bytes.ptr, &bytesLength, null, &charsLength);
	line 633 changed to
	ConvertINetString(&dwMode, codePage_, CP_UTF8, bytes.ptr, &bytesLength, cast(ubyte*)chars.ptr, &charsLength);

	run build.bat, build juno.lib sucessed.


example of use juno

	save code below to test.d:
	
		//from http://www.dsource.org/projects/juno/wiki/Tutorials/LateBinding
		import juno.com.core;
		import juno.com.client;
		pragma(lib,"juno.lib");

		int main() {
			try
			{
				// Create an instance of the Message object
				scope auto message = new juno.com.client.DispatchObject("CDO.Message");
				printf("auto message \n");
				// Build the mail message
				message.set("Subject", "test juno cdo.message");
				message.set("TextBody", "hello,D china http://bbs.yidabu.com");
				message.set("From", "www.yidabu.com at gmail.com"); // Replace with your email address
				message.set("To", "bbs.yidabu.com at gmail.com"); // Replace with the recipient's email address
				// Configure CDOSYS to send via a remote SMTP server

				scope auto config = new DispatchObject(message.get("Configuration"));
				// Call config's Fields property and get a reference to its Fields instance
				scope auto fields = new DispatchObject(config.get("Fields"));
				// Set the appropriate values
				scope auto sendUsing = new DispatchObject(fields.get("Item",
				 "http://schemas.microsoft.com/cdo/configuration/sendusing"));
				sendUsing.set("Value", 2); // cdoSendUsingPort = 2
				scope auto port = new DispatchObject(fields.get("Item",
				 "http://schemas.microsoft.com/cdo/configuration/smtpserverport"));
				port.set("Value", 465);
				scope auto server = new DispatchObject(fields.get("Item",
				 "http://schemas.microsoft.com/cdo/configuration/smtpserver"));
				server.set("Value", "smtp.gmail.com"); // Replace 'mail.remote.com' with your remote server's address
				// Set the authentication type, user name and password

				scope auto authentication = new DispatchObject(fields.get("Item",
				 "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"));
				authentication.set("Value", 1); // cdoBasic = 1

				scope auto ssl = new DispatchObject(fields.get("Item","http://schemas.microsoft.com/cdo/configuration/smtpusessl"));
				ssl.set("Value",true);

				scope auto userName = new DispatchObject(fields.get("Item",
				 "http://schemas.microsoft.com/cdo/configuration/sendusername"));
				userName.set("Value", "www.yidabu.com"); // Replace 'username' with your account's user name
				scope auto password = new DispatchObject(fields.get("Item",
				 "http://schemas.microsoft.com/cdo/configuration/sendpassword"));
				password.set("Value", "bbs.yidabu.com"); // Replace 'password' with your account's password
				fields.call("Update");
				message.call("Send");
				printf("send sucessed \n");
			}//try
			catch(Exception e)
			{
				printf("catch %.*s\n",e.msg);
				return 1;
			}
			return 0;
		}
	

	build test.d, cause error: not found shlwapi.lib, so:
	
		implib /s shlwapi.lib shlwapi.dll
	
	copy shlwapi.lib to \dmd\lib.

	build test.d, com.base.stirng.TypeInfo_Aa cause error: com.base.string, commented TypeInfo_Aa, build test.d sucessed, but when run test.exe, will cause unhandled Error: Stack Overflow,

	how to got when and where cause Stack Overflow?

	download ddbg from:
	http://ddbg.mainia.de/
	copy ddbg.exe,ddbg_debug.exe to D:\d\dmd\bin.

	commandline:ddbg test.exe

	then input:r to run test.exe,prompt:
	Unhandled Exception at juno.base.string.ArgumentList.opCall(class TypeInfo[],void*)

	I'd no idea to fix this.
	my simple solution is cancled "import juno.base.string" in juno.com.core, copy some function from juno.base.string to juno.com.core.

	build test.d, prompt error:Symbol Undefined _SafeArrayGetVartype at 8,search msdn, got:
	
		HRESULT SafeArrayGetVartype(
			SAFEARRAY *psa,
			VARTYPE *pvt
		);
	

	change code below in juno.com.core:
	
		int SafeArrayGetVartype(SAFEARRAY* psa, out ushort pvt);
	
	to:
	
		int SafeArrayGetVartype(SAFEARRAY* psa, out ushort* pvt);
	

	line 568 changed to:
	
		ushort* pvt = &vt;
		SafeArrayGetVartype(value, pvt);
	

	changed:
	
		struct SAFEARRAYBOUND {
			uint cElements;
			int lLbound;
		}

		struct SAFEARRAY {
			ushort cDims;
			ushort fFeatures;
			uint cbElements;
			uint cLocks;
			void* pvData;
			SAFEARRAYBOUND[1] rgsabound;
	

	to:
	


		//bbs.yidabu.com: below from win32.com.OAIDL
		struct myIID {	// size is 16
			align(1):
			uint Data1;
			ushort	Data2;
			ushort	Data3;
			byte	Data4[8];
		}

		struct	FLAGGED_WORD_BLOB
			{
			uint fFlags;
			uint clSize;
			ushort[1] asData;
			}
		alias FLAGGED_WORD_BLOB	*wireBSTR;
		struct SAFEARR_BSTR {
			uint Size;
			wireBSTR * aBstr;
		}

		//
		struct SAFEARR_UNKNOWN {
			uint Size;
			IUnknown * apUnknown;
		}

		//
		struct SAFEARR_DISPATCH {
			uint Size;
			IDispatch * apDispatch;
		}

		//
		struct _wireVARIANT {
		}
		struct _wireBRECORD {
		}
		// Forward references.
		alias _wireVARIANT * wireVARIANT;
		alias _wireBRECORD * wireBRECORD;
		struct SAFEARR_VARIANT {
			uint Size;
			wireVARIANT * aVariant;
		}

		//
		struct SAFEARR_BRECORD {
			uint Size;
			wireBRECORD * aRecord;
		}

		//
		struct SAFEARR_HAVEIID {
			uint Size;
			IUnknown * apUnknown;
			myIID	iid;
		}

		//
		struct BYTE_SIZEDARR
			{
			uint clSize;
			byte	*pData;
			}	;

			//
		 struct	WORD_SIZEDARR
			{
			uint clSize;
			ushort *pData;
			}	;

			//
		struct	DWORD_SIZEDARR
			{
			uint clSize;
			uint * pData;
			}	;

			//
		struct	HYPER_SIZEDARR
			{
			uint clSize;
			long *pData;
			}



		union uSAFEARRAY_UNION {
		SAFEARR_BSTR	BstrStr;
		SAFEARR_UNKNOWN	UnknownStr;
		SAFEARR_DISPATCH DispatchStr;
		SAFEARR_VARIANT	VariantStr;
		SAFEARR_BRECORD	RecordStr;
		SAFEARR_HAVEIID	HaveIidStr;
		BYTE_SIZEDARR	ByteStr;
		WORD_SIZEDARR	WordStr;
		DWORD_SIZEDARR	LongStr;
		HYPER_SIZEDARR	HyperStr;
		}

		struct SAFEARRAY_UNION {
			uint sfType;
			uSAFEARRAY_UNION u;
		}

		alias SAFEARRAY_UNION SAFEARRAYUNION;

		struct SAFEARRAYBOUND {
			uint cElements;
			int lLbound;
		}
		struct wireSAFEARRAY {
			ushort cDims;
			ushort fFeatures;
			uint	cbElements;
			uint	cLocks;
			SAFEARRAYUNION uArrayStructs;
			SAFEARRAYBOUND[1] rgsabound;
		}
		alias wireSAFEARRAY SAFEARRAY ;
		//bbs.yidabu.com:above from win32.com.OAIDL
	

	run build.bat:
	
		dmd test.d \dmd\src\other\juno\com\core.d \dmd\src\other\juno\com\client.d -g -debug -O -L/exet:nt/su:windows:4.0
	

	prompt:Symbol Undefined _SafeArrayGetVartype at 8
	search SafeArrayGetVartype in oleaut32.lib, found nothing.

	download linkdef from:
	http://www.dprogramming.com/linkdef.php
	build with:
	
		dmd test.d \dmd\src\other\juno\com\core.d \dmd\src\other\juno\com\client.d -g -debug -O -L/exet:nt/su:windows:4.0 | linkdef oleaut32
	

	then:
	
		implib safearray.lib oleaut32.def
	
	copy safearray.lib to \d\dm\lib, add code below to juno.com.core:
	
		pragma(lib, "safearray.lib");
	

	build test.d, run test.exe, send mail to gmail sucessed.



More information about the Digitalmars-d mailing list