我想将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()?
我需要知道进程使用的所有内存地址空间.稍后将扫描存储空间以定位过程中的值并识别它们的位置/地址.我目前的过程是通过其(基址+内存大小)获取每个模块的基址.
我正在一个已知地址已知值的进程上测试它.当我查找该特定地址时,我得到了我期望的值.但是,当我扫描(我相信是)进程使用的所有地址空间时,我无法在任何地方找到该值.
我知道在0x0CF8DC38和0x0CF8DDDC处存在数值"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) 仅当值的值需要比当前平台支持的更多位时才抛出异常.
虽然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抛出异常,是不安全的关键字?
要在托管代码中分配内存,我使用:
IntPtr [] params_list_n = new IntPtr [5];
Run Code Online (Sandbox Code Playgroud)
但是对于非托管内存我使用Marshal.AllocHGlobal
而且我不明白在这种情况下如何为数组分配内存.
理想情况下,我想使用函数调用Marshal.GetNativeVariantForObject (o, params_list_n[i]);
对于数组的每个元素.
我从这里的@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) 全部,这是上一个问题的后续跟进: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) 可能会有一点菜鸟的问题,但这是让我在过去几个小时(或几天)的泡菜中得到的东西......
我在.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签名的调用约定和参数是否与目标非托管签名匹配.
我想在2种不同的类型上使用WaitForMultipleObjects:
我不知道如何将(以适当的方式)"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.所有答案都非常好.
十分感谢!!!
有没有办法直接获取IntPtrMemoryMappedFile中的数据?我有大数据块,频率变化很大,我不想复制它
我需要在下面的函数中获得 IntPtr.Zero 的确切含义。我使用此函数将 word 文档文本范围位置像素值转换为 WPF 单位值。
Graphics g = Graphics.FromHwnd(IntPtr.Zero)
Run Code Online (Sandbox Code Playgroud)
这通常说通过句柄,但我没有得到它。