Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从COM指针到记录/如何执行(dotNet';s)Marshal.ptr结构的Delphi版本_Delphi_Pointers_Com_Record - Fatal编程技术网

从COM指针到记录/如何执行(dotNet';s)Marshal.ptr结构的Delphi版本

从COM指针到记录/如何执行(dotNet';s)Marshal.ptr结构的Delphi版本,delphi,pointers,com,record,Delphi,Pointers,Com,Record,正在寻找有关如何强制转换/转换指向记录的指针的帮助—类似于dotNet的Marshal.PtrToStructure—但使用Delphi 详细信息:使用ActiveX/COM(C++中的原始代码)。实现一个接口,允许捕获由ActveX控件引发的事件 实现接口的一个方法签名如下所示: procedure TIUIX_ObjImplEvent.OnEvent(const pSender: IUIX_Obj; const pEvent: IUIX_Event); IUIX_事件是一个接口(源自ID

正在寻找有关如何强制转换/转换指向记录的指针的帮助—类似于dotNet的Marshal.PtrToStructure—但使用Delphi

详细信息:使用ActiveX/COM(C++中的原始代码)。实现一个接口,允许捕获由ActveX控件引发的事件

实现接口的一个方法签名如下所示:

procedure TIUIX_ObjImplEvent.OnEvent(const pSender: IUIX_Obj;  const pEvent: IUIX_Event);
IUIX_事件是一个接口(源自IDispatch)。具有类型为Param_T的属性Param1

Param1保存指向记录类型的指针

现在,我想将C#代码转换为Delphi:

public void OnEvent(IUIX_Obj pSender, IUIX_Event pEvent)
{
    //some more code before, and then this part:

    IntPtr outPtr = new IntPtr(pEvent.Param1);
    UIX_NotifyInfo ni = (UIX_NotifyInfo)System.Runtime.InteropServices.Marshal.PtrToStructure(outPtr, typeof(UIX_NotifyInfo));
}
UIX\U NotifyInfo是一条记录(/struct)

问题:如何从pEvent.Param1转到ni?使用Delphi:

procedure TIUIX_ObjImplEvent.OnEvent(const pSender: IUIX_Obj;  const pEvent: IUIX_Event);
var
  ni : UIX_NotifyInfo;
begin
  pEvent.Handled := false;

  if (pEvent.Code = e_Notify) then
  begin

    //how to go from pEvent.Param1 to ni like in C#'s PtrToStructure?

    if (ni.nCode = UIX_Notify_BeforeShowPopup) then
    begin
      pEvent.Handled := true;
    end;
  end;
end;
我猜是在使用Move过程,但无论我尝试什么,它要么无法编译,要么崩溃:)

我在大卫回答后加上这个

下面是对上述问题的扩展(查找如何处理Marshal.GetObjectForIUnknown)

我有一个C#代码:

具有:

IUIX_Event = interface(IDispatch)
IUIX_Obj = interface(IDispatch)
IUIX_Dialog = interface(IUIX_ObjImpl) (IDispatch)
我的Delphi代码(dlg:IUIX_对话框,pImpl:Pointer):

上述方法确实有效


是否有更好的方法或正确的方法?

在非托管代码中很简单,它只是一个赋值

var
  Rec: TMyRec;
  Ptr: Pointer;
.... 
Rec := TMyRec(Ptr^);

我很感谢你对这个扩展问题(我已经编辑过)发表评论。我不能对此发表评论,因为有太多我看不到的具体细节。无论如何,这是一个新的、不同的问题,不应该通过编辑和扩展现有问题来回答,尤其是那些已经回答的问题。
IUIX_Event = interface(IDispatch)
IUIX_Obj = interface(IDispatch)
IUIX_Dialog = interface(IUIX_ObjImpl) (IDispatch)
pTarget.QueryImpl(GetTypeData(TypeInfo(IUIX_Dialog)).Guid, nil, @pImpl);
Move(pImpl, dlg, SizeOf(IUIX_Dialog));
var
  Rec: TMyRec;
  Ptr: Pointer;
.... 
Rec := TMyRec(Ptr^);