mirror of https://github.com/adamdruppe/arsd.git
com.d: Support float / double retrieval in Variant
This commit is contained in:
parent
bab31bab6c
commit
b4b8bbcc6b
42
com.d
42
com.d
|
@ -250,11 +250,11 @@ struct ComResult {
|
||||||
|
|
||||||
T getD(T)() {
|
T getD(T)() {
|
||||||
switch(result.vt) {
|
switch(result.vt) {
|
||||||
case 3: // int
|
case Vt.long_: // int
|
||||||
static if(is(T : const long))
|
static if(is(T : const long))
|
||||||
return result.intVal;
|
return result.intVal;
|
||||||
throw new Exception("cannot convert variant of type int to requested " ~ T.stringof);
|
throw new Exception("cannot convert variant of type int to requested " ~ T.stringof);
|
||||||
case 8: // string
|
case Vt.string_:
|
||||||
static if(is(T : const string))
|
static if(is(T : const string))
|
||||||
return makeUtf8StringFromWindowsString(result.bstrVal); // FIXME free?
|
return makeUtf8StringFromWindowsString(result.bstrVal); // FIXME free?
|
||||||
throw new Exception("cannot convert variant of type string to requested " ~ T.stringof);
|
throw new Exception("cannot convert variant of type string to requested " ~ T.stringof);
|
||||||
|
@ -720,6 +720,28 @@ auto getComObject(T = Dynamic)(wstring c, bool tryCreateIfGetFails = true) {
|
||||||
// FIXME: add one to get by ProgID rather than always guid
|
// FIXME: add one to get by ProgID rather than always guid
|
||||||
// FIXME: add a dynamic com object that uses IDispatch
|
// FIXME: add a dynamic com object that uses IDispatch
|
||||||
|
|
||||||
|
/// Variant Type
|
||||||
|
/// https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/vartype-function
|
||||||
|
private enum Vt
|
||||||
|
{
|
||||||
|
empty = 0,
|
||||||
|
null_ = 1,
|
||||||
|
integer = 2,
|
||||||
|
long_ = 3,
|
||||||
|
single = 4,
|
||||||
|
double_ = 5,
|
||||||
|
currency = 6,
|
||||||
|
date = 7,
|
||||||
|
string_ = 8,
|
||||||
|
object = 9,
|
||||||
|
error = 10,
|
||||||
|
boolean = 11,
|
||||||
|
variant = 12,
|
||||||
|
dataObject = 13,
|
||||||
|
decimal = 14,
|
||||||
|
byte_ = 17,
|
||||||
|
longLong = 20,
|
||||||
|
}
|
||||||
|
|
||||||
/* COM SERVER CODE */
|
/* COM SERVER CODE */
|
||||||
|
|
||||||
|
@ -729,19 +751,25 @@ T getFromVariant(T)(VARIANT arg) {
|
||||||
static if(is(T == void)) {
|
static if(is(T == void)) {
|
||||||
return;
|
return;
|
||||||
} else static if(is(T == int)) {
|
} else static if(is(T == int)) {
|
||||||
if(arg.vt == 3)
|
if(arg.vt == Vt.long_)
|
||||||
return arg.intVal;
|
return arg.intVal;
|
||||||
|
} else static if (is(T == float)) {
|
||||||
|
if(arg.vt == Vt.single)
|
||||||
|
return arg.fltVal;
|
||||||
|
} else static if (is(T == double)) {
|
||||||
|
if(arg.vt == Vt.double_)
|
||||||
|
return arg.dblVal;
|
||||||
} else static if(is(T == bool)) {
|
} else static if(is(T == bool)) {
|
||||||
if(arg.vt == 11)
|
if(arg.vt == Vt.boolean)
|
||||||
return arg.boolVal ? true : false;
|
return arg.boolVal ? true : false;
|
||||||
} else static if(is(T == string)) {
|
} else static if(is(T == string)) {
|
||||||
if(arg.vt == 8) {
|
if(arg.vt == Vt.string_) {
|
||||||
auto str = arg.bstrVal;
|
auto str = arg.bstrVal;
|
||||||
scope(exit) SysFreeString(str);
|
scope(exit) SysFreeString(str);
|
||||||
return to!string(str[0 .. SysStringLen(str)]);
|
return to!string(str[0 .. SysStringLen(str)]);
|
||||||
}
|
}
|
||||||
} else static if(is(T == IDispatch)) {
|
} else static if(is(T == IDispatch)) {
|
||||||
if(arg.vt == 9)
|
if(arg.vt == Vt.object)
|
||||||
return arg.pdispVal;
|
return arg.pdispVal;
|
||||||
} else static if(is(T : IUnknown)) {
|
} else static if(is(T : IUnknown)) {
|
||||||
// if(arg.vt == 13)
|
// if(arg.vt == 13)
|
||||||
|
@ -789,7 +817,7 @@ T getFromVariant(T)(VARIANT arg) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw new Exception("Type mismatch, needed "~ T.stringof ~"got " ~ to!string(arg.vt));
|
throw new Exception("Type mismatch, needed "~ T.stringof ~" got " ~ to!string(cast(Vt) arg.vt));
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue