1

我是这方面的新手。我正在尝试将 propvariant 转换为 C# 中的变体

我有这样的代码。

      public static object PropValueToVariant(PROPVARIANT Value)
    {
        object result;
        DateTime stTime;
        DateTime ftTime;
        object __Null;
        // Convert the prop variant to variant data type

        switch(Value.vt)
        {
            //@ Undeclared identifier(3): 'VT_I1'
            case VT_I1:
                //@ Unsupported property or method(C): 'bVal'
                result = Value.bVal;
                break;
            //@ Undeclared identifier(3): 'VT_UI1'
            case VT_UI1:
                //@ Unsupported property or method(C): 'bVal'
                result = Value.bVal;
                break;
            //@ Undeclared identifier(3): 'VT_I2'
            case VT_I2:
                //@ Unsupported property or method(C): 'iVal'
                result = Value.iVal;
                break;
            //@ Undeclared identifier(3): 'VT_UI2'
            case VT_UI2:
                //@ Unsupported property or method(C): 'uiVal'
                result = Value.uiVal;
                break;
            //@ Undeclared identifier(3): 'VT_I4'
            case VT_I4:
                //@ Unsupported property or method(C): 'lVal'
                result = Value.lVal;
                break;
            //@ Undeclared identifier(3): 'VT_UI4'
            case VT_UI4:
                //@ Unsupported property or method(C): 'ulVal'
                result = ((int)Value.ulVal);
                break;
            //@ Undeclared identifier(3): 'VT_I8'
            case VT_I8:
                //@ Unsupported property or method(C): 'hVal'
                //@ Unsupported property or method(D): 'LowPart'
                result = ((int)Value.hVal.LowPart);
                break;
            //@ Undeclared identifier(3): 'VT_UI8'
            case VT_UI8:
                //@ Unsupported property or method(C): 'uhVal'
                //@ Unsupported property or method(D): 'LowPart'
                result = ((int)Value.uhVal.LowPart);
                break;
            //@ Undeclared identifier(3): 'VT_BOOL'
            case VT_BOOL:
                //@ Unsupported property or method(C): 'boolVal'
                result = Value.boolVal;
                break;
            //@ Undeclared identifier(3): 'VT_R4'
            case VT_R4:
                //@ Unsupported property or method(C): 'fltVal'
                result = Value.fltVal;
                break;
            //@ Undeclared identifier(3): 'VT_R8'
            case VT_R8:
                //@ Unsupported property or method(C): 'dblVal'
                result = Value.dblVal;
                break;
            //@ Undeclared identifier(3): 'VT_CY'
            case VT_CY:
                //@ Unsupported property or method(C): 'cyVal'
                result = Value.cyVal;
                break;
            //@ Undeclared identifier(3): 'VT_ERROR'
            case VT_ERROR:
                //@ Unsupported property or method(C): 'scode'
                result = Value.scode;
                break;
            //@ Undeclared identifier(3): 'VT_DATE'
            case VT_DATE:
                //@ Unsupported property or method(C): 'date'
                result = Value.date;
                break;
            //@ Undeclared identifier(3): 'VT_FILETIME'
            case VT_FILETIME:
                //@ Unsupported property or method(C): 'filetime'
                //@ Unsupported function or procedure: 'FileTimeToLocalFileTime'
                FileTimeToLocalFileTime(Value.filetime, ftTime);
                //@ Undeclared identifier(3): 'FileTimeToSystemTime'
                FileTimeToSystemTime(ftTime, stTime);
                result = stTime;
                break;
            //@ Undeclared identifier(3): 'VT_CLSID'
            case VT_CLSID:
                //@ Unsupported property or method(C): 'puuid'
                result = Value.puuid.ToString();
                break;
            //@ Undeclared identifier(3): 'VT_BSTR'
            case VT_BSTR:
                //@ Unsupported property or method(C): 'bstrVal'
                result = Value.bstrVal;
                break;
            //@ Undeclared identifier(3): 'VT_LPSTR'
            case VT_LPSTR:
                //@ Unsupported property or method(C): 'pszVal'
                result = (Value.pszVal as string);
                break;
            //@ Undeclared identifier(3): 'VT_LPWSTR'
            case VT_LPWSTR:

                result = WideCharToString(Value.pwszVal);
                break;
            default:
                result = __Null;
                break;
        }
        return result;
    }

为什么我收到案例名称错误?它也不理解 ulval、lval 等....

非常感谢你的帮助

4

2 回答 2

0

您应该使用Marshal该类和几个 P/Invoke 调用:

  • 分配一个 16 字节数组(例如,通过AllocCoTaskMem)(编辑:为 64 位进程设置 24 字节)
  • 通过 P/Invoke 调用将其归零VariantInit
  • 然后进行实际转换,使用对PropVariantToVariant的 P/Invoke 调用来用变体数据填充此缓冲区
  • 您现在可以通过Marshal.GetObjectForNativeVariant
  • 不要忘记清理:
    • AP/调用呼叫PropVariantClear
    • 另一个到VariantClear
    • 然后用Marshal.FreeCoTaskMem.
于 2016-09-15T14:30:47.533 回答
-1

你不需要这个功能,这里是已经在 .net 框架中实现的功能:http: //msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.getobjectfornativevariant.aspx

于 2012-10-19T16:08:40.147 回答