long 能转换为intPtr 类型吗?谁来解释一下哈

dreammyboy 2010-09-16 02:35:14
我的程序是这样的:

//创建线程钩子
string a = Process.GetCurrentProcess().MainModule.ModuleName;

long moduleName = Win32API.GetModuleHandle(a);

IntPtr b = new IntPtr( moduleName); //这句话出错,错误信息是:算术运算导致溢出。
hHook = Win32API.SetWindowsHookEx(WH_KEYBOARD, KeyBoardProcedure, b, 0);

Win32API中GetModuleHandle()定义如下:
[DllImport("kernel32")]
public static extern long GetModuleHandle(string lpModuleName);

我在网上查的GetModuleHandle的返回值是long类型的,这个例子也是书上的。
呵呵,谁能解释一下哈。
...全文
574 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dreammyboy 2010-09-16
  • 打赏
  • 举报
回复
恩恩,好的。。明白了哈。。谢谢啦
兔子-顾问 2010-09-16
  • 打赏
  • 举报
回复
笔误笔误,囧,大于等于需要的size。
的确,如果到了64位系统下,需要用Int64来保存IntPtr,如果用int就会错了。
dreammyboy 2010-09-16
  • 打赏
  • 举报
回复
那是不是这样,我们现在的操作系统是32位的,所以我们可以用intPtr就可以大于等于内存地址了,如果以后给64位的系统编程是不是用intPtr就不可以啦。。表示不了那么大的内存哈。。呵呵。。
gongsun 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wuyazhe 的回复:]
你只要大于等于要求的内存地址。对上就行了。
[/Quote]


这句话是关键。
porschev 2010-09-16
  • 打赏
  • 举报
回复
学习。。。。。
兔子-顾问 2010-09-16
  • 打赏
  • 举报
回复
api调用中,可没约定c#的类型是IntPtr还是int,或是long,你只要大于等于要求的内存地址。对上就行了。
dreammyboy 2010-09-16
  • 打赏
  • 举报
回复
那调用Windows 的API函数时,我们不是尽量要和windows的函数定义保持一致吗?
兔子-顾问 2010-09-16
  • 打赏
  • 举报
回复
IntPtr p = new IntPtr(你的Long变量);
wuyq11 2010-09-16
  • 打赏
  • 举报
回复
[DllImport("kernel32.dll")]
public static extern IntPtr GetModuleHandle(string name);
GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
bloodish 2010-09-16
  • 打赏
  • 举报
回复
直接返回IntPtr即可


[DllImport("kernel32")]
public static extern IntPtr GetModuleHandle(string lpModuleName);

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧