首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个ByVal类型声明

多个ByVal类型声明
EN

Stack Overflow用户
提问于 2011-10-22 22:03:05
回答 2查看 996关注 0票数 0

我有过

代码语言:javascript
复制
Private Declare Function ReadProcessMemory Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Integer, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer

但我也需要

代码语言:javascript
复制
Private Declare Function ReadProcessMemory Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Single, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer

还有其他一些变体。因此,正如上面的示例所示,lpBuffer是单一的,而不是整数。我怎样才能做到这一点?

UPDATE:好的,现在我要这样做:

代码语言:javascript
复制
Imports System.Math
Imports System.Threading
Imports System.Runtime.InteropServices

Public Class Form1

'Declare ReadProcessMemory with lpBuffer As IntPtr
Private Declare Function ReadProcessMemory Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As IntPtr, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer

'This is the function I am now having trouble with
Public Function memfloat(ByVal address As Long, ByVal processHandle As IntPtr)
        Dim floatvalueinmemory As Single
        ReadProcessMemory(processHandle, address, floatvalueinmemory, 4, 0)
        Dim letstryagain As Single 'floatvalueinmemory didn't give the desired result, so going to try to TryParse
        Single.TryParse(floatvalueinmemory, letstryagain)
        Return CStr(letstryagain) 'returns the same result as floatvalueinmemory did
    End Function

End Class

Partial Public Class NativeMethods
    <DllImport("user32.dll")> _
    Public Shared Function ReadProcessMemory(ByVal hProcess As System.IntPtr, ByVal lpBaseAddress As IntPtr, ByVal lpBuffer As System.IntPtr, ByVal nSize As UInteger, ByVal lpNumberOfBytesRead As IntPtr) As Boolean
    End Function
End Class

memfloat函数用于返回类似于"-75,48196“的内容,现在它返回类似于"-1,012555E+09”的内容(实际值不匹配,仅以这些值为例),这就是为什么我首先要多次声明的原因。如何从IntPtr转换为单个?

起作用的是:

代码语言:javascript
复制
Public Function memstring(ByVal address As Long, ByVal length As Int32, ByVal processHandle As IntPtr)
    Dim stringinmemory As Long
    Dim ret1 As Byte() = Nothing
    Dim tStr(length) As Char
    Dim retStr As String = ""
    For i As Int32 = 0 To length - 1
        ReadProcessMemory(processHandle, address + i, stringinmemory, 1, 0)
        ret1 = BitConverter.GetBytes(stringinmemory)
        tStr(i) = System.Text.Encoding.ASCII.GetString(ret1) : retStr += tStr(i)
    Next
    Return retStr
End Function

这将正确地将内存值作为字符串返回。所以是的,现在只是单曲引起了问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-23 08:12:04

无论如何,您都在使用Alias关键字,因此要利用它:

代码语言:javascript
复制
Private Declare Function ReadProcessMemoryInt Lib "kernel32" _
    Alias "ReadProcessMemory" (ByVal hProcess As Integer, _
                               ByVal lpBaseAddress As Integer, _
                               ByRef lpBuffer As Integer, _
                               ByVal nSize As Integer, _
                               ByRef lpNumberOfBytesWritten As Integer) As Integer

Private Declare Function ReadProcessMemorySingle Lib "kernel32" _
    Alias "ReadProcessMemory" (ByVal hProcess As Integer, _
                               ByVal lpBaseAddress As Integer, _
                               ByRef lpBuffer As Single, _
                               ByVal nSize As Integer, _
                               ByRef lpNumberOfBytesWritten As Integer) As Integer

您给函数的名称可以是任意的。只有Alias名称必须与库中的名称匹配。在您的代码中,您可以引用ReadProcessMemoryIntReadProcessMemorySingle (或您选择的任何名称)。

(注意:我没有检查您是否正确地使用了API,我只是回答了您关于如何用不同的签名两次定义同一个API函数的问题。)

票数 2
EN

Stack Overflow用户

发布于 2011-10-23 04:35:24

我启动了P/Invoke Interop Assistant工具(链接),找到了ReadProcessMemory并在vb.net中生成了签名如下:

代码语言:javascript
复制
Partial Public Class NativeMethods    
    '''Return Type: BOOL->int
    '''hProcess: HANDLE->void*
    '''lpBaseAddress: LPCVOID->void*
    '''lpBuffer: LPVOID->void*
    '''nSize: SIZE_T->ULONG_PTR->unsigned int
    '''lpNumberOfBytesRead: SIZE_T*
    <System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint:="ReadProcessMemory")>  _
    Public Shared Function ReadProcessMemory(<System.Runtime.InteropServices.InAttribute()> ByVal hProcess As System.IntPtr, <System.Runtime.InteropServices.InAttribute()> ByVal lpBaseAddress As System.IntPtr, ByVal lpBuffer As System.IntPtr, ByVal nSize As UInteger, ByVal lpNumberOfBytesRead As System.IntPtr) As <System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)> Boolean
    End Function
End Class

因此,缓冲器是IntPtr,您需要将其转换为各种类型的数组。我建议您查看Marshal类及其静态方法。这里还有指向可能的相关文章所以链接url 1url 2的链接。可能需要从c#到vb.net的翻译。我还注意到,在这些在线示例中,函数定义可以重载(这让我感到惊讶)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7862910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档