Public Type udtGUID
          Data1 As Long
          Data2 As Integer
          Data3 As Integer
          Data4(7) As Byte
      End Type==================================
      Public Const INTERFACESAFE_FOR_UNTRUSTED_CALLER = &H1
      Public Const INTERFACESAFE_FOR_UNTRUSTED_DATA = &H2
      Public Const E_NOINTERFACE = &H80004002
      Public Const E_FAIL = &H80004005
      Public Const MAX_GUIDLEN = 40
============================================
          Dim Rc      As Long
          Dim rClsId  As udtGUID
          Dim IID     As String
          Dim bIID()  As Byte          pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER Or _
                                INTERFACESAFE_FOR_UNTRUSTED_DATA          If (riid <> 0) Then
              CopyMemory rClsId, ByVal riid, Len(rClsId)              bIID = String$(MAX_GUIDLEN, 0)
              Rc = StringFromGUID2(rClsId, VarPtr(bIID(0)), MAX_GUIDLEN)
              Rc = InStr(1, bIID, vbNullChar) - 1
              IID = Left$(UCase(bIID), Rc)              Select Case IID
                  Case IID_IDispatch
                      pdwEnabledOptions = IIf(m_fSafeForScripting, _
                    INTERFACESAFE_FOR_UNTRUSTED_CALLER, 0)
                      Exit Sub
                  Case IID_IPersistStorage, IID_IPersistStream, _
                     IID_IPersistPropertyBag
                      pdwEnabledOptions = IIf(m_fSafeForInitializing, _
                    INTERFACESAFE_FOR_UNTRUSTED_DATA, 0)
                      Exit Sub
                  Case Else
                      Err.Raise E_NOINTERFACE
                      Exit Sub
              End Select
          End If

解决方案 »

  1.   

    Public Type udtGUID
              Data1 As Long
              Data2 As Integer
              Data3 As Integer
              Data4(7) As Byte
          End Type
    type udtGUID = record
      Data1: LongInt;
      Data2: Integer;
      Data3: Integer;
      Data4: array [0..6] of BYTE;
    end;Public Const INTERFACESAFE_FOR_UNTRUSTED_CALLER = &H1
          Public Const INTERFACESAFE_FOR_UNTRUSTED_DATA = &H2
          Public Const E_NOINTERFACE = &H80004002
          Public Const E_FAIL = &H80004005
          Public Const MAX_GUIDLEN = 40
    Const INTERFACESAFE_FOR_UNTRUSTED_CALLER = $1; // 应该是。。偶也没具体试过 :-<
    Const INTERFACESAFE_FOR_UNTRUSTED_DATA  = $2;
    Const E_NOINTERFACE = $80004002;
    Const E_FAIL = $H80004005;
    Const MAX_GUIDLEN = 40;
      

  2.   

    http://www.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_20318648.html
      

  3.   

    var
      Rc:LongInt;
      rClsId: udtGUID;
      IID: string;  
      bIID: array of BYTE;  pdwSupportedOptions := INTERFACESAFE_FOR_UNTRUSTED_CALLER Or _INTERFACESAFE_FOR_UNTRUSTED_DATA;
      If riid <> 0 Then
      begin
         CopyMemory(rClsId, @riid, SizeOf(rClsId));
       bIID := String$(MAX_GUIDLEN, 0); // 不清楚了 :-<
       Rc := StringFromGUID2(rClsId, bIID, MAX_GUIDLEN); // or &bIID;
       Rc = Pos(' ', bIID) - 1; // 没把握...唉。。
       IID = Left$(UCase(bIID), Rc); // 不会 ;-<   case IID of
         IID_IDispatch:
           pdwEnabledOptions := IIf(m_fSafeForScripting, _INTERFACESAFE_FOR_UNTRUSTED_CALLER, 0);
           Exit;
         IID_IPersistStorage,IID_IPersistStream,_IID_IPersistPropertyBag:
           pdwEnabledOptions := IIf(m_fSafeForInitializing, _INTERFACESAFE_FOR_UNTRUSTED_DATA, 0);
           Exit;
         else:
           raise Exception.CreateFrm('Error %d', [E_NOINTERFACE]);
           Exit;
       end;
    end;
     
    不好意思了 偶尽我所能 :-<....