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