基本问题求助

jixingzhong 2006-08-11 07:47:06
VB 代码如下:

Private Declare Sub Make Lib "makebar.dll" _
(ucData As Byte, ByVal nLen As Long, ByVal szFileName As String, ByVal nClumn As Long, ByVal nErr As Long, ByVal nHLRatio As Long)
Private Sub Command1_Click()
Dim a() As Byte
a = StrConv(Text1.Text, vbFromUnicode)
Make a(0), UBound(a) - LBound(a) + 1, "abc.bmp", CLng(Text2.Text), CLng(Text3.Text), CLng(Text4.Text)
Image1.Picture = LoadPicture("abc.bmp")
End Sub



现同样的功能,用 VB.Net, 代码如下:

Public Class Form1

Private Declare Sub Make Lib "makebar.dll" _
(ByVal ucData As Byte, ByVal nLen As Long, ByVal szFileName As String, ByVal nClumn As Long, ByVal nErr As Long, ByVal nHLRatio As Long)


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a() As Byte
a = System.Text.Encoding.Default.GetBytes(RichTextBox1.Text)
Make(a(0), UBound(a) - LBound(a) + 1, "temp.bmp", CLng(TextBox1.Text), CLng(TextBox2.Text), CLng(TextBox3.Text))
PictureBox1.Load("temp.bmp")
End Sub
End Class

结果提示 访问内存非法:
System.AccessViolationException: Attempted to read or write protected memory.

请问原因何在? 该如何修正?
...全文
201 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingtoo008 2006-08-12
  • 打赏
  • 举报
回复
路过...
------------------------------------------------------------------------------------
100M.Net空间+50M企业邮局=60元/年
100M.Net空间+国际顶级域名=100元/年
国际顶级域名.com.net.cn=50元/年
本站申请域名可绑定免费10M Asp.Net空间
1000M.Net空间 + 100M MsSql数据库 + 1000M企业邮局 + 顶级域名=600元/年
数据库 企业邮局 网站推广 整机租用 美国空间 网站建设 均有售
还有很多优惠套餐提供给各个用户层.
有意者可联系电话:021-64802212 传真:021-64802212
咨询信箱:info@kingtoo.com 咨询OICQ:68311305,379620139 81778640

cnhgj 2006-08-12
  • 打赏
  • 举报
回复
看一下你的DLL有没有问题。。我在VC下写了一个是正常的。。用你的代码调用我的dll也没有报错

void _stdcall Make(unsigned char* ucData, long nDataLen,
char* szBmpFileName, long nClumn, long nErr,
long nHLRatio)
{
if (ucData != NULL)
ucData[0] = 'a';
}



<DllImport("mydll.dll", CharSet:=CharSet.Unicode, SetlastError:=True, EntryPoint:="Make")> Private Sub Make(ByRef ucData As Byte, ByVal nLen As Long, ByVal szFileName As String, ByVal nClumn As Long, ByVal nErr As Long, ByVal nHLRatio As Long)
End Sub

Sub Main()
Dim a() As Byte = Encoding.Default.GetBytes("test")
Console.WriteLine(Chr(a(0)))
Make(a(0), UBound(a) - LBound(a) + 1, "temp.bmp", 0, 0, 0)
Console.WriteLine(Chr(a(0)))
Console.Read()
End Sub
jixingzhong 2006-08-12
  • 打赏
  • 举报
回复
void __stdcal Make(unsigned char* ucData, long nDataLen, char* szBmpFileName, long nClumn, long nErr, long nHLRatio);



<DllImport("MakeBar.dll")> Private Shared Sub Make(ByRef ucData As Byte, ByVal nLen As Long, ByVal szFileName As String, ByVal nClumn As Long, ByVal nErr As Long, ByVal nHLRatio As Long)
End Sub

第一个参数是否一致了?
改成:
<DllImport("MakeBar.dll")> Private Shared Sub Make(ByVal ucData As String, ByVal nLen As Long, ByVal szFileName As String, ByVal nClumn As Long, ByVal nErr As Long, ByVal nHLRatio As Long)
End Sub

还是提示错误:
System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at VB.Net.Form1.Make(String ucData, Int64 nLen, String szFileName, Int64 nClumn, Int64 nErr, Int64 nHLRatio)
cnhgj 2006-08-12
  • 打赏
  • 举报
回复
噢。。楼上一言道出天机,在.net中long是64位,而c++中是32位。。而我们总是在第一个指针参数那里考虑。。。
HAVENT 2006-08-12
  • 打赏
  • 举报
回复
VB6 的 Long要变成 Int ,不然会造成内存溢出的
jamesfay 2006-08-11
  • 打赏
  • 举报
回复
这个应该是访问非法内存吧?
比如系统内存?
我是套用 C 的理解方式来的 ...

VB 中应该也是这么个意思吧?
在 debug 中,
取得的数组内容和 文本框是一致的,
长度也是一致的,
数组下标什么的也应该正常(从 0 开始)
不知道这个访问内存非法会在什么地方产生?

======================================================
最好的办法就死debug进去,具体看看make函数的问题出在什么地方?
jamesfay 2006-08-11
  • 打赏
  • 举报
回复
字面理解,进程没有获得足够的权限来操作内存块
coolstarhty 2006-08-11
  • 打赏
  • 举报
回复
可以的话,把你的DLL给我试试?
coolstarhty 2006-08-11
  • 打赏
  • 举报
回复
a = StrConv(Text1.Text, vbFromUnicode)
------------------------------------------
a = System.Text.Encoding.Default.GetBytes(RichTextBox1.Text)

估计是字符编码问题,下面的方法不行么?
a = System.Text.Encoding.Unicode.GetBytes(RichTextBox1.Text)

jixingzhong 2006-08-11
  • 打赏
  • 举报
回复
后来考虑到一个问题:
在 VB 中参数默认是 ByRef 传递的,
而在 VB.Net 中默认 ByVal 传递,于是修改了试了一下,发现还是同样的错误 ...
coolstarhty 2006-08-11
  • 打赏
  • 举报
回复
a = System.Text.Encoding.Unicode.GetBytes(RichTextBox1.Text)

换这句试试

16,721

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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