游戏开发论坛

 找回密码
 立即注册
搜索
楼主: zlcnkkm

[.NET问题]关于DllImport属性

[复制链接]

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2005-10-10 15:13:00 | 显示全部楼层

Re:[.NET问题]关于DllImport属性

VB.NET已经有和C++兼容的类型了,不支持Any和Variant类型,所有的数据类型都可以“装箱”变成Object对象类型,.NET中所有的对象都是从Object派生而来。如果你把VB.NET当成C++来学习,一切变得都非常Easy

我学习VB.NET的时间不会比你长,唯一使用VB.NET编写的程序就是那个打飞机的程序,不到2小时

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
 楼主| 发表于 2005-10-10 15:43:00 | 显示全部楼层

Re:[.NET问题]关于DllImport属性

1。Any类型的问题解决了

2。你上面的API的返回类型为Long是错的,应该是Integer,但是,即使改了返回类型,FindWindow永远都是返回0

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
 楼主| 发表于 2005-10-10 15:49:00 | 显示全部楼层

Re:[.NET问题]关于DllImport属性

3。Imports System.Runtime.InteropServices写在类的外面就不再提示"未定义类型“DllImport”了,那在AssemblyInfo.vb中写Imports System.Runtime.InteropServices不行的吗?

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2005-10-10 15:56:00 | 显示全部楼层

Re:[.NET问题]关于DllImport属性

2。你上面的API的返回类型为Long是错的,应该是Integer,但是,即使改了返回类型,FindWindow永远都是返回0

Long不是错的,Integer也没问题,至少我返回的不是0,你不信把计算器打开看看,返回的是计算器的窗口句柄

上面的代码没有问题,我运行过的

50

主题

382

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
发表于 2005-10-10 16:34:00 | 显示全部楼层

Re:[.NET问题]关于DllImport属性

没有了Any 但我们可以把 Any 变成我们想要的类型,比如下面的"lpClassName"的类型变成了 Integer

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Integer, ByVal lpWindowName As String) As Integer

将 ByVal 改成 ByRef 就可以传址

如果你打开计算器,我给的这个API不会返回0,呵呵!

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
 楼主| 发表于 2005-10-10 19:14:00 | 显示全部楼层

Re:[.NET问题]关于DllImport属性

Re天魂.NET:如果直接用Declare声明API,确实是没有任何问题

Rebigbook2000:我确实是用你写的代码运行的,一句也没改过;返回值为Long型是会死机的,改成Integer真是永远都返回0(不要怀疑我没有打开计算器)

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
 楼主| 发表于 2005-10-10 19:34:00 | 显示全部楼层

Re:[.NET问题]关于DllImport属性

说得很混乱,总结一下

用Declare声明FindWindow,确实可以返回正确的句柄,但是,如果用值为“计算器”的变量传递到该API,当API返回的时候,该变量的值会变成“计”。暂时的解决方法是把该项变量的值赋给一个过程级的变量,用这个过程级变量来传值给API

用DllImport声明FindWindow,如果返回类型为Long,那么程序会死掉;如果返回类型为Integer,则永远都返回0

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2005-10-10 23:49:00 | 显示全部楼层

Re: [.NET问题]关于DllImport属性

我也不是空口说白话
sf_20051010234832.jpg

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2005-10-11 00:05:00 | 显示全部楼层

Re: [.NET问题]关于DllImport属性

不过我还真找到了问题,Long确实是有问题的,返回的值并不是计算器的句柄,至于是什么我也不知道,改一下

    <DllImport("user32.DLL", EntryPoint:="FindWindowW", _
    CharSet:=CharSet.Auto)> _
    Public Shared Function _
    FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
    End Function

因为CharSet.Auto默认是Unicode的,所以DLL的入口应该是Unicode版本的FindWindowW

很多问题就是这样哈哈,分析分析有很大帮助
sf_200510110441.jpg

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2005-10-11 00:12:00 | 显示全部楼层

Re:[.NET问题]关于DllImport属性

32位的机器,地址都是32位的,.NET中Long是64位的,如果使用Long,高4位是无效的,Integer是正确的,但是最安全的应该是IntPtr作为返回值

    <DllImport("user32.DLL", EntryPoint:="FindWindowW", _
    CharSet:=CharSet.Auto)> _
    Public Shared Function _
    FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    End Function

如果我们要使用 FindWindowA 作为函数的入口,那么应该如下声明

    <DllImport("user32.DLL", EntryPoint:="FindWindowA", _
    CharSet:=CharSet.Ansi)> _
    Public Shared Function _
    FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    End Function

学到了一些东西,希望对大家也有帮助,我对.NET不是很熟悉,大家原谅

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-28 03:04

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表