comparison dwt/ole/win32/Variant.d @ 300:acf6957f2344

OLE fixes, thanks to Enzo Petrelli.
author Frank Benoit <benoit@tionex.de>
date Thu, 28 Aug 2008 15:12:24 +0200
parents fd9c62a2998e
children
comparison
equal deleted inserted replaced
299:4faf63f6948f 300:acf6957f2344
481 COM.VariantInit(pData); 481 COM.VariantInit(pData);
482 482
483 // set type 483 // set type
484 pData.vt = type; 484 pData.vt = type;
485 if ((type & COM.VT_BYREF) is COM.VT_BYREF) { 485 if ((type & COM.VT_BYREF) is COM.VT_BYREF) {
486 COM.MoveMemory(pData, &type, 2); 486 COM.MoveMemory((cast(void*)pData), &type, 2);
487 COM.MoveMemory(pData + 8, &byRefPtr, 4); 487 COM.MoveMemory((cast(void*)pData) + 8, &byRefPtr, 4);
488 return; 488 return;
489 } 489 }
490 490
491 switch (type) { 491 switch (type) {
492 case COM.VT_EMPTY : 492 case COM.VT_EMPTY :
493 case COM.VT_NULL : 493 case COM.VT_NULL :
494 COM.MoveMemory(pData, &type, 2); 494 COM.MoveMemory((cast(void*)pData), &type, 2);
495 break; 495 break;
496 case COM.VT_BOOL : 496 case COM.VT_BOOL :
497 COM.MoveMemory(pData, &type, 2); 497 COM.MoveMemory((cast(void*)pData), &type, 2);
498 auto v = booleanData ? COM.VARIANT_TRUE : COM.VARIANT_FALSE; 498 auto v = booleanData ? COM.VARIANT_TRUE : COM.VARIANT_FALSE;
499 COM.MoveMemory(pData + 8, &v, 2); 499 COM.MoveMemory((cast(void*)pData) + 8, &v, 2);
500 break; 500 break;
501 case COM.VT_I1 : 501 case COM.VT_I1 :
502 COM.MoveMemory(pData, &type, 2); 502 COM.MoveMemory((cast(void*)pData), &type, 2);
503 COM.MoveMemory(pData + 8, &byteData, 1); 503 COM.MoveMemory((cast(void*)pData) + 8, &byteData, 1);
504 break; 504 break;
505 case COM.VT_I2 : 505 case COM.VT_I2 :
506 COM.MoveMemory(pData, &type, 2); 506 COM.MoveMemory((cast(void*)pData), &type, 2);
507 COM.MoveMemory(pData + 8, &shortData, 2); 507 COM.MoveMemory((cast(void*)pData) + 8, &shortData, 2);
508 break; 508 break;
509 case COM.VT_UI2 : 509 case COM.VT_UI2 :
510 COM.MoveMemory(pData, &type, 2); 510 COM.MoveMemory((cast(void*)pData), &type, 2);
511 COM.MoveMemory(pData + 8, &charData, 2); 511 COM.MoveMemory((cast(void*)pData) + 8, &charData, 2);
512 break; 512 break;
513 case COM.VT_I4 : 513 case COM.VT_I4 :
514 COM.MoveMemory(pData, &type, 2); 514 COM.MoveMemory((cast(void*)pData), &type, 2);
515 COM.MoveMemory(pData + 8, &intData, 4); 515 COM.MoveMemory((cast(void*)pData) + 8, &intData, 4);
516 break; 516 break;
517 case COM.VT_I8 : 517 case COM.VT_I8 :
518 COM.MoveMemory(pData, &type, 2); 518 COM.MoveMemory((cast(void*)pData), &type, 2);
519 COM.MoveMemory(pData + 8, &longData, 8); 519 COM.MoveMemory((cast(void*)pData) + 8, &longData, 8);
520 break; 520 break;
521 case COM.VT_R4 : 521 case COM.VT_R4 :
522 COM.MoveMemory(pData, &type, 2); 522 COM.MoveMemory((cast(void*)pData), &type, 2);
523 COM.MoveMemory(pData + 8, &floatData, 4); 523 COM.MoveMemory((cast(void*)pData) + 8, &floatData, 4);
524 break; 524 break;
525 case COM.VT_R8 : 525 case COM.VT_R8 :
526 COM.MoveMemory(pData, &type, 2); 526 COM.MoveMemory((cast(void*)pData), &type, 2);
527 COM.MoveMemory(pData + 8, &doubleData, 8); 527 COM.MoveMemory((cast(void*)pData) + 8, &doubleData, 8);
528 break; 528 break;
529 case COM.VT_DISPATCH : 529 case COM.VT_DISPATCH :
530 dispatchData.AddRef(); 530 dispatchData.AddRef();
531 COM.MoveMemory(pData, &type, 2); 531 COM.MoveMemory((cast(void*)pData), &type, 2);
532 auto v = cast(void*)dispatchData; 532 auto v = cast(void*)dispatchData;
533 COM.MoveMemory(pData + 8, &v, 4); 533 COM.MoveMemory((cast(void*)pData) + 8, &v, 4);
534 break; 534 break;
535 case COM.VT_UNKNOWN : 535 case COM.VT_UNKNOWN :
536 unknownData.AddRef(); 536 unknownData.AddRef();
537 COM.MoveMemory(pData, &type, 2); 537 COM.MoveMemory((cast(void*)pData), &type, 2);
538 auto v = cast(void*)dispatchData; 538 auto v = cast(void*)dispatchData;
539 COM.MoveMemory(pData + 8, &v, 4); 539 COM.MoveMemory((cast(void*)pData) + 8, &v, 4);
540 break; 540 break;
541 case COM.VT_BSTR : 541 case COM.VT_BSTR :
542 COM.MoveMemory(pData, &type, 2); 542 COM.MoveMemory((cast(void*)pData), &type, 2);
543 wchar[] data = StrToWCHARs(stringData); 543 wchar[] data = StrToWCHARs(stringData);
544 auto ptr = COM.SysAllocString(data.ptr); 544 auto ptr = COM.SysAllocString(data.ptr);
545 COM.MoveMemory(pData + 8, &ptr, 4); 545 COM.MoveMemory((cast(void*)pData) + 8, &ptr, 4);
546 break; 546 break;
547 547
548 default : 548 default :
549 OLE.error(DWT.ERROR_NOT_IMPLEMENTED); 549 OLE.error(DWT.ERROR_NOT_IMPLEMENTED);
550 } 550 }
894 894
895 void setData(VARIANT* pData){ 895 void setData(VARIANT* pData){
896 if (pData is null) OLE.error(OLE.ERROR_INVALID_ARGUMENT); 896 if (pData is null) OLE.error(OLE.ERROR_INVALID_ARGUMENT);
897 897
898 short[1] dataType ; 898 short[1] dataType ;
899 COM.MoveMemory(dataType.ptr, pData, 2); 899 COM.MoveMemory(dataType.ptr, (cast(void*)pData), 2);
900 type = dataType[0]; 900 type = dataType[0];
901 901
902 if ((type & COM.VT_BYREF) is COM.VT_BYREF) { 902 if ((type & COM.VT_BYREF) is COM.VT_BYREF) {
903 void*[1] newByRefPtr; 903 void*[1] newByRefPtr;
904 OS.MoveMemory(newByRefPtr.ptr, pData + 8, 4); 904 OS.MoveMemory(newByRefPtr.ptr, (cast(void*)pData) + 8, 4);
905 byRefPtr = newByRefPtr[0]; 905 byRefPtr = newByRefPtr[0];
906 return; 906 return;
907 } 907 }
908 908
909 switch (type) { 909 switch (type) {
910 case COM.VT_EMPTY : 910 case COM.VT_EMPTY :
911 case COM.VT_NULL : 911 case COM.VT_NULL :
912 break; 912 break;
913 case COM.VT_BOOL : 913 case COM.VT_BOOL :
914 short[1] newBooleanData; 914 short[1] newBooleanData;
915 COM.MoveMemory(newBooleanData.ptr, pData + 8, 2); 915 COM.MoveMemory(newBooleanData.ptr, (cast(void*)pData) + 8, 2);
916 booleanData = (newBooleanData[0] !is COM.VARIANT_FALSE); 916 booleanData = (newBooleanData[0] !is COM.VARIANT_FALSE);
917 break; 917 break;
918 case COM.VT_I1 : 918 case COM.VT_I1 :
919 byte[1] newByteData; 919 byte[1] newByteData;
920 COM.MoveMemory(newByteData.ptr, pData + 8, 1); 920 COM.MoveMemory(newByteData.ptr, (cast(void*)pData) + 8, 1);
921 byteData = newByteData[0]; 921 byteData = newByteData[0];
922 break; 922 break;
923 case COM.VT_I2 : 923 case COM.VT_I2 :
924 short[1] newShortData; 924 short[1] newShortData;
925 COM.MoveMemory(newShortData.ptr, pData + 8, 2); 925 COM.MoveMemory(newShortData.ptr, (cast(void*)pData) + 8, 2);
926 shortData = newShortData[0]; 926 shortData = newShortData[0];
927 break; 927 break;
928 case COM.VT_UI2 : 928 case COM.VT_UI2 :
929 wchar[1] newCharData; 929 wchar[1] newCharData;
930 COM.MoveMemory(newCharData.ptr, pData + 8, 2); 930 COM.MoveMemory(newCharData.ptr, (cast(void*)pData) + 8, 2);
931 charData = newCharData[0]; 931 charData = newCharData[0];
932 break; 932 break;
933 case COM.VT_I4 : 933 case COM.VT_I4 :
934 int[1] newIntData; 934 int[1] newIntData;
935 OS.MoveMemory(newIntData.ptr, pData + 8, 4); 935 OS.MoveMemory(newIntData.ptr, (cast(void*)pData) + 8, 4);
936 intData = newIntData[0]; 936 intData = newIntData[0];
937 break; 937 break;
938 case COM.VT_I8 : 938 case COM.VT_I8 :
939 long[1] newLongData; 939 long[1] newLongData;
940 OS.MoveMemory(newLongData.ptr, pData + 8, 8); 940 OS.MoveMemory(newLongData.ptr, (cast(void*)pData) + 8, 8);
941 longData = newLongData[0]; 941 longData = newLongData[0];
942 break; 942 break;
943 case COM.VT_R4 : 943 case COM.VT_R4 :
944 float[1] newFloatData; 944 float[1] newFloatData;
945 COM.MoveMemory(newFloatData.ptr, pData + 8, 4); 945 COM.MoveMemory(newFloatData.ptr, (cast(void*)pData) + 8, 4);
946 floatData = newFloatData[0]; 946 floatData = newFloatData[0];
947 break; 947 break;
948 case COM.VT_R8 : 948 case COM.VT_R8 :
949 double[1] newDoubleData; 949 double[1] newDoubleData;
950 COM.MoveMemory(newDoubleData.ptr, pData + 8, 8); 950 COM.MoveMemory(newDoubleData.ptr, (cast(void*)pData) + 8, 8);
951 doubleData = newDoubleData[0]; 951 doubleData = newDoubleData[0];
952 break; 952 break;
953 case COM.VT_DISPATCH : { 953 case COM.VT_DISPATCH : {
954 IDispatch[1] ppvObject; 954 IDispatch[1] ppvObject;
955 OS.MoveMemory(ppvObject.ptr, pData + 8, 4); 955 OS.MoveMemory(ppvObject.ptr, (cast(void*)pData) + 8, 4);
956 if (ppvObject[0] is null) { 956 if (ppvObject[0] is null) {
957 type = COM.VT_EMPTY; 957 type = COM.VT_EMPTY;
958 break; 958 break;
959 } 959 }
960 dispatchData = ppvObject[0]; 960 dispatchData = ppvObject[0];
961 dispatchData.AddRef(); 961 dispatchData.AddRef();
962 break; 962 break;
963 } 963 }
964 case COM.VT_UNKNOWN : { 964 case COM.VT_UNKNOWN : {
965 IUnknown[1] ppvObject; 965 IUnknown[1] ppvObject;
966 OS.MoveMemory(ppvObject.ptr, pData + 8, 4); 966 OS.MoveMemory(ppvObject.ptr, (cast(void*)pData) + 8, 4);
967 if (ppvObject[0] is null) { 967 if (ppvObject[0] is null) {
968 type = COM.VT_EMPTY; 968 type = COM.VT_EMPTY;
969 break; 969 break;
970 } 970 }
971 unknownData = ppvObject[0]; 971 unknownData = ppvObject[0];
973 break; 973 break;
974 } 974 }
975 case COM.VT_BSTR : 975 case COM.VT_BSTR :
976 // get the address of the memory in which the string resides 976 // get the address of the memory in which the string resides
977 wchar*[1] hMem; 977 wchar*[1] hMem;
978 OS.MoveMemory(hMem.ptr, pData + 8, 4); 978 OS.MoveMemory(hMem.ptr, (cast(void*)pData) + 8, 4);
979 if (hMem[0] is null) { 979 if (hMem[0] is null) {
980 type = COM.VT_EMPTY; 980 type = COM.VT_EMPTY;
981 break; 981 break;
982 } 982 }
983 // Get the size of the string from the OS - the size is expressed in number 983 // Get the size of the string from the OS - the size is expressed in number