标签: intptr

如何将IntPtr/Int转换为Socket?

我想将message.WParam转换为Socket.

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == Values.MESSAGE_ASYNC)
        {

            switch (m.LParam.ToInt32())
            {
                case Values.FD_READ:
                    WS2.Receive(m.WParam);
                case Values.FD_WRITE: break;
                default: break;
            }

        }
        else
        {
            base.WndProc(ref m);
        }
    }

public class WS2
{
    public static void Receive(IntPtr sock)
    {
        Socket socket = sock;
    }
}
Run Code Online (Sandbox Code Playgroud)

如何将IntrPtr(sock)转换为Socket,以便我可以调用Receive()?

c# sockets winsock intptr

5
推荐指数
1
解决办法
2751
查看次数

如何获取进程使用的所有内存地址空间?

我需要知道进程使用的所有内存地址空间.稍后将扫描存储空间以定位过程中的值并识别它们的位置/地址.我目前的过程是通过其(基址+内存大小)获取每个模块的基址.

我正在一个已知地址已知值的进程上测试它.当我查找该特定地址时,我得到了我期望的值.但是,当我扫描(我相信是)进程使用的所有地址空间时,我无法在任何地方找到该值.

我知道在0x0CF8DC380x0CF8DDDC处存在数值"4143000" .当我调用ReadMemoryBytes(module,module.BaseAddress,4,(IntPtr)(0x0CF8DC38))时,我返回字节(152,55,63,0).当我调用BitConverter.GetBytes(4143000)时,我得到了相同的字节集.当我在该进程上使用不同的内存扫描程序时,我会在这些地址处找到该值.

但是,当我扫描"已知地址"时,我在任何地方都找不到这个值.看起来我的代码甚至找不到进程使用的那些地址.

因此,我的问题是双重的:

  • 如何在此过程中找到这些地址?
  • 我担心我可能正在处理系统内存中的绝对地址与进程中的相对地址.我这样做了吗?

.

// (in the calling method)
foreach (ProcessModule module in process.Modules) {
    ParameterizedThreadStart pst = new ParameterizedThreadStart(p => SearchModule(module, value));
    Thread t = new Thread(pst);
    t.Start(); }

private unsafe void SearchModule(ProcessModule module, string value)
{
Process process = getProcess;
int iVal;
double dVal;
int.TryParse(value, out iVal);
double.TryParse(value, out dVal);
for (Int64 addr = (Int64)module.BaseAddress; addr + value.Length < (Int64)module.BaseAddress + module.ModuleMemorySize; addr++)
{
    // …
Run Code Online (Sandbox Code Playgroud)

c# memory interop intptr

5
推荐指数
1
解决办法
4789
查看次数

为什么IntPtr.ToInt32在64位模式下抛出OverflowException并且Explicit(IntPtr到Int32)不

运营商在MSDN上的描述有一个注释:

仅当值的值需要比当前平台支持的更多位时才抛出异常.

虽然ToInt32我的描述不是这样,但我认为标题不完全正确(为了简洁起见),

更正确的问题是:"为什么IntPtr.ToInt32会引发OverflowException在64位模式,价值观适应的Int32和显式(IntPtr的到Int32)已不"

反编译IntPtr ToInt32和运算符看起来非常相似:

public static explicit operator int(IntPtr value)
{
  return (int) value.m_value;
}

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public unsafe int ToInt32()
{
  return (int) this.m_value;
}
Run Code Online (Sandbox Code Playgroud)

我想知道是什么让ToInt32抛出异常,是不安全的关键字?

clr 64-bit intptr

5
推荐指数
1
解决办法
2620
查看次数

如何在非托管内存中分配IntPtr []数组?

要在托管代码中分配内存,我使用:

IntPtr [] params_list_n = new IntPtr [5];
Run Code Online (Sandbox Code Playgroud)

但是对于非托管内存我使用Marshal.AllocHGlobal 而且我不明白在这种情况下如何为数组分配内存.

理想情况下,我想使用函数调用Marshal.GetNativeVariantForObject (o, params_list_n[i]); 对于数组的每个元素.

c# arrays memory-management intptr alloc

5
推荐指数
1
解决办法
6735
查看次数

VBNET中的(IntPtr)1的等价物?

我从这里的@Hans Passant代码中获取了一段代码:MessageBox中的粗体文本

这是C#代码:

SendMessage(hText, WM_SETFONT, mFont.ToHfont(), (IntPtr)1)
Run Code Online (Sandbox Code Playgroud)

哪个会翻译成vb.net?

这不起作用(无法编译):

SendMessage(hText, WM_SETFONT, mFont.ToHfont(), DirectCast(1, IntPtr))
Run Code Online (Sandbox Code Playgroud)

.net c# vb.net intptr code-translation

5
推荐指数
1
解决办法
1161
查看次数

如何将IntPtr转换回对象

全部,这是上一个问题的后续跟进:C#格式化外部Dll函数参数

这里特别是我试图转换为C#的代码:

FILES_GetMemoryMapping((LPSTR)(LPCTSTR)MapFile, &Size, (LPSTR)MapName, &PacketSize, pMapping, &PagePerSector);
// Allocate the mapping structure memory
pMapping = (PMAPPING)malloc(sizeof(MAPPING));
pMapping->NbSectors = 0;
pMapping->pSectors = (PMAPPINGSECTOR) malloc((Size) * sizeof(MAPPINGSECTOR));

// Get the mapping info
FILES_GetMemoryMapping((LPSTR)(LPCTSTR)MapFile, &Size, (LPSTR)(LPCTSTR)MapName, &PacketSize, pMapping, &PagePerSector);
Run Code Online (Sandbox Code Playgroud)

函数"FILES_GetMemoryMapping"被调用两次,我猜第一次得到结构的大小,第二次实际填充它.

"pMapping"是指向C++结构的指针,在我的C#代码中,我将pMapping作为IntPtr类型.下一行我可以转换为:

pMapping = Marshal.AllocHGlobal(Marshal.SizeOf(new UM0516.Mapping()));
Run Code Online (Sandbox Code Playgroud)

(UM0516.Mapping)是结构.很酷,所以我刚刚分配了一些IntPtr指向的空间.现在为下一行......"pMapping-> NbSectors = 0;"

我怎么想进入现在分配的非托管内存空间,键入将其转换为(UM0516.Mapping)结构,并设置其中一个成员?然后确保我没有过多地使用它,以便第二次调用"FILES_GetMemoryMapping"时,它现在可以使用这个结构吗?

- 好的,我已经采取了一些建议,现在有了这个:

我尝试了这个,并在第一个"FILES_GetMemoryMapping"调用中得到"AccessViolationException未处理"异常

这是我有的:

string filepath = @"C:\blah.blah";
string MapFile = @"D:\blah.blah";
UM0516.Mapping myMapping = new UM0516.Mapping();
IntPtr pMapping = Marshal.AllocHGlobal(Marshal.SizeOf(myMapping));
Marshal.StructureToPtr(myMapping, pMapping, false);
ushort PacketSize = 0;
ushort size = …
Run Code Online (Sandbox Code Playgroud)

c# unmanaged marshalling intptr

4
推荐指数
1
解决办法
2万
查看次数

在.NET 4中使用IntPtr时出现PInvokeStackImbalance异常?(适用于.NET 3.5)

可能会有一点菜鸟的问题,但这是让我在过去几个小时(或几天)的泡菜中得到的东西......

我在.NET Framework 4.0的代码中调用DLL中的方法

  [DllImport("xeneth.dll")]
    public static extern ErrorCode XC_GetFrame(Int32 h, FrameType type, ulong ulFlags, IntPtr buff, uint size);
Run Code Online (Sandbox Code Playgroud)

然后在这里使用它:

if (XC_GetFrame(myCam, XC_GetFrameType(myCam), 0, IntPtr.Zero, (uint)fs) != ErrorCode.E_NO_FRAME)
Run Code Online (Sandbox Code Playgroud)

但是,当我在.NET 4.0中运行它时,我得到一个P/INVOKE错误,但是......在3.5中运行它不会触发此错误.在我和另一个程序员完成代码之后,我们似乎把它归结为在4.0上运行不同的IntPtr.

我的应用程序需要在.NET 4.0中运行,因为应用程序所需的一些功能仅在4.0中可用...

有什么可能我忽略或只是忘记包括?

任何想法都非常感谢!

汤姆

更新:

土着宣言:

virtual ErrCode XCamera::GetFrame(FrameType type, unsigned long ulFlags, void *buffer, unsigned int size)
Run Code Online (Sandbox Code Playgroud)

错误:对PInvoke函数'DLLTest!DLLTest.Form1 :: XC_GetFrameType'的调用使堆栈失衡.这很可能是因为托管PInvoke签名与非托管目标签名不匹配.检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配.

.net c# intptr c#-3.0 c#-4.0

4
推荐指数
1
解决办法
3290
查看次数

如何等待2中的第一个:进程和EventWaitHandle

我想在2种不同的类型上使用WaitForMultipleObjects:

  • 一个'EventWaitHandle'
  • 'Process.Handle'==> intptr

我不知道如何将(以适当的方式)"process.Handle"转换为WaitHandle以使以下代码工作:

   var waitHandles = new WaitHandle[2];
   waitHandles[0] = waitHandleExit;
   // Next line is the offending one:
   waitHandles[1] = new SafeWaitHandle(process.Handle, false);
   int waitResult = WaitHandle.WaitAny(waitHandles, timeOut);
Run Code Online (Sandbox Code Playgroud)

我得到错误:

Error   1   Cannot implicitly convert type 'Microsoft.Win32.SafeHandles.SafeWaitHandle' to 'System.Threading.WaitHandle' ...
Run Code Online (Sandbox Code Playgroud)

有人知道等待进程和EventWaitHandle的正确方法吗?

更新......我选择答案的原因.

首先感谢所有人:Jaroen,Slugart和Sriram.所有答案都非常好.

  • 由于我忽略的原因,Jaroen解决方案在我的机器上无效.我的'退出'事件从未发生过(也许仅在Disposed?).
  • Slugart解决方案工作得很好,我在尝试之前尝试了它.
  • Sriram解决方案工作得很好,我选择了它,因为我没有创建一个错误的EventWaitHandle,并且根据我的愿景似乎更干净.

十分感谢!!!

c# process intptr waithandle

4
推荐指数
1
解决办法
1433
查看次数

如何让IntPtr访问MemoryMappedFile的视图?

有没有办法直接获取IntPtrMemoryMappedFile中的数据?我有大数据块,频率变化很大,我不想复制它

c# memory-mapped-files intptr

4
推荐指数
1
解决办法
1061
查看次数

System.Drawing.Graphics 中的 IntPtr.Zero 是什么意思

我需要在下面的函数中获得 IntPtr.Zero 的确切含义。我使用此函数将 word 文档文本范围位置像素值转换为 WPF 单位值。

Graphics g = Graphics.FromHwnd(IntPtr.Zero)
Run Code Online (Sandbox Code Playgroud)

这通常说通过句柄,但我没有得到它。

.net c# winapi intptr word-addins

4
推荐指数
1
解决办法
1522
查看次数