gpt4 book ai didi

c# - 我如何从指针地址获取对象

转载 作者:行者123 更新时间:2023-11-30 22:05:52 26 4
gpt4 key购买 nike

我已经为 WinCC (Siemens) (SCADA) 编写了一个用户控件。现在我想传递一个指向控件的指针。唯一的方法是:将指针写入属性。

WinCC 只有这个方法来设置属性

  • 设置PropBOOL
  • 设置属性
  • SetPropDouble
  • 设置PropWord

控件的属性将 UInt 作为数据类型,我使用 SetPropDouble 方法设置对象的地址。

WinCC 全局脚本 (ANSI-C)

//autoDB is an ADODB.Connection object
//object* autoDB = __object_create("ADODB.Connection");
extern __object* autoDB;
//SetPropDouble( "PictureName", "ControlName", "PropertyName", (DWORD)(&autoDB) );
SetPropDouble( "PictureName", "ControlName", "PropertyName", (DWORD)autoDB );

我调试了我的控件( Hook WinCC 进程),我看到属性集被分配了一个地址值,例如0x03041080。

现在的问题是:如何在地址上获取 c# (.Net) 中的对象?

我的尝试抛出异常:ExecutionEngineException

private ADODB.Connection _database;
private IntPtr _ptr = IntPtr.Zero;

public uint DataBase{
get{
return (uint)_ptr;
}
set{
if( value != 0 ){
_ptr = (IntPtr)value;
GCHandle gH = GCHandle.FromIntPtr(_ptr); // THIS LINE THROW THE EXCEPTION
_database = gH.Target;
}
}
}

好的:我已经更改了我的代码以使用 STRING

WinCC

extern __object* autoDB;
DWORD addr = (DWORD)autoDB;
char sAddr[11];
sprintf( sAddr, "%d\0", addr );
SetPropChar( "PictureName", "ControlName", "DataBaseAddr", sAddr );

现在是c#

private string _lpszDataBaseAddr = "";
public string DataBaseAddr{
get{
return _lpszDataBaseAddr;
}
set{
uint addr;
bool ret = uint.TryParse( value, out addr );
if( ! ret ){
return;
}
IntPtr ptr = (IntPtr)addr;
GCHandle gH = GCHandle.FromIntPtr( ptr ); // THE SAME ERROR!
}
}

其他发现!

ADO 对象的地址不在调用我的控件的进程内存中(使用 ollydbg 调试)。 WinCC 有两个程序:用于可视化的 PDLRT.exe(这是调用我的控件)和用于运行 GLOBAL-SCRIPT (Ansi-C) 的 SCRIPT.exe。

从 PDLRT,我可以从 ADO-Object 访问指针地址。通过在 ADO 对象地址的 C# 中调用 GCHandle,抛出异常。 (ExecutionEngineException)

最佳答案

我不知道 C# 是否可以像那样通过指针访问 C++。

无论如何,这个:(DWORD)(&autoDB) 是错误的,它将指针的地址 作为属性的值,这是毫无意义的。

您需要指针的值,即 (DWORD) autoDB

此外,SetPropDouble() 接受类型为 double 的值,即 float 。这不是共享指针的好方法,它是一个(大)整数。尝试一些不同的表示,如果您无法访问足够大的整数,字符串可能会起作用。

关于c# - 我如何从指针地址获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24033938/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com