从COM指针到记录/如何执行(dotNet';s)Marshal.ptr结构的Delphi版本
正在寻找有关如何强制转换/转换指向记录的指针的帮助—类似于dotNet的Marshal.PtrToStructure—但使用Delphi 详细信息:使用ActiveX/COM(C++中的原始代码)。实现一个接口,允许捕获由ActveX控件引发的事件 实现接口的一个方法签名如下所示:从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
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^);