小弟现在要用vb(只会vb)写一个加密函数,根据大侠们的方法编译成不用注册的标准dll(这个dll在vb中成功调出mdk5函数)给公司的另外一个同事用(他用C#)vb代码如下Private Declare Function GetPhyCode Lib "kspdll.dll" (ByVal prodcode As String, ByVal hostcode As String, ByVal IsNumber As Long, ByVal decode As String) As Long。。(这个代码中包含引用一个dll和若干给mdk5的函数)
由于太长不让贴身略了
Public Function mdk5(ByVal sn As String) As Long '加密
Dim tempstr2 As String
Dim ssid
hostid = getdiskname("a")
ssid = "colakesp"
tempstr2 = Space(12) '分配空间
Call GetPhyCode(ssid, hostid, 1, tempstr2)
ssid2 = Mid(tempstr2, 5, 8)
Dim tempstr3 As String
tempstr3 = Space(12) '分配空间
Call GetPhyCode(ssid2, "e0009999", 1, tempstr3)
codetemp = "A01" & "-" & "e0009999" & tempstr3
If sn = codetemp Then
mdk5 = 1
Else
mdk5 = 0
End If
End FunctionSub Main()
'确保VB能编译
End Sub
Function DLLMain(ByVal hInstDLL As Long, ByVal fdwReason As Long, ByVal lpwReserved As Long) As Long
DLLMain = 1
End Function现在要在c#中调用mdk5函数同事c#中using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.InteropServices;//这是用到DllImport时候要引入的包
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
mdk5("111111111111");
}
[DllImport("mdd.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
public static extern int mdk5(string sn);
}
}
dll放在system32下面了。如果不放在SYSTEM32或c# exe文件同目录的话会报找不到DLL错误,如果函数名故意写错的话C#会先报找不到入口点的错误,这说明了2个问题
1、c#已经找到正确的DLL
2、c#已经找到DLL中的函数了。
现在一直报“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”错误小弟是菜鸟,大哥哥们救命啊。关系饭碗。。
由于太长不让贴身略了
Public Function mdk5(ByVal sn As String) As Long '加密
Dim tempstr2 As String
Dim ssid
hostid = getdiskname("a")
ssid = "colakesp"
tempstr2 = Space(12) '分配空间
Call GetPhyCode(ssid, hostid, 1, tempstr2)
ssid2 = Mid(tempstr2, 5, 8)
Dim tempstr3 As String
tempstr3 = Space(12) '分配空间
Call GetPhyCode(ssid2, "e0009999", 1, tempstr3)
codetemp = "A01" & "-" & "e0009999" & tempstr3
If sn = codetemp Then
mdk5 = 1
Else
mdk5 = 0
End If
End FunctionSub Main()
'确保VB能编译
End Sub
Function DLLMain(ByVal hInstDLL As Long, ByVal fdwReason As Long, ByVal lpwReserved As Long) As Long
DLLMain = 1
End Function现在要在c#中调用mdk5函数同事c#中using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.InteropServices;//这是用到DllImport时候要引入的包
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
mdk5("111111111111");
}
[DllImport("mdd.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
public static extern int mdk5(string sn);
}
}
dll放在system32下面了。如果不放在SYSTEM32或c# exe文件同目录的话会报找不到DLL错误,如果函数名故意写错的话C#会先报找不到入口点的错误,这说明了2个问题
1、c#已经找到正确的DLL
2、c#已经找到DLL中的函数了。
现在一直报“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”错误小弟是菜鸟,大哥哥们救命啊。关系饭碗。。
GAC看看
GAC 是什么啊。小弟愚钝啊。。??
==================
可以,我甚至见过不要vb6运行环境dll的可执行文件,我没用过vb6对楼主提不出有益的建议。
考虑,vb6 的string 与 .net的string 的不同
viena(维也纳nn-下潜15米,潜望镜升起)
我在VB中编出来的的确是标准的DLL,只是用了改LINK.EXE的方法。
我在vb中能Private Declare Function mdk5 Lib "mdk5.dll" (ByVal sn as string) As Long
调用函数就说明了其的确是标准DLLhdt(倦怠) 兄弟说的方向应该是对的。我也觉得是数据类型的差异造成,但就是不知道怎么改jetxia(Thinking&Asking&Studying)兄弟,我觉得vb中能调用mdk5函数,说明了并非dll本身操作内存报错的而应该是
c#中 mdk5("111111111111"); 时报错的。
1、c#已经找到正确的DLL
2、c#已经找到DLL中的函数了。这个问题,如果是win程序的话,只需放到和exe所在目录即可;如果是web程序,在2000系统下,会出现你所说的现象,因此需要放到system32目录下,除此外,别的系统都不会出现类似问题。to 现在一直报“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”错误用StringBuilder来替换String
调用的时候必须初始化StringBuilder
例如:
StringBuilder sBuffer = new StringBuilder(256);
public static extern int mdk5( IntPtr bstr );IntPtr bstr = StringToBSTR("11111");
mdk5(bstr);
我突然想到了一个新的解决办法,那就是用C#做Dll ^_^
兄弟你既然能翻译了mdk5,那么能帮忙翻译下其他几个函数吗?也就是MDK5函数行数的10倍左右5555,小弟真的没辙了。周末前就要交差啊。。cancerser(都是混饭吃,记得要结帖)您在北京吗?搞定的话俺周六请你到我家楼下吃全聚德啊,
亚运村店。。
IntPtr bstr = Marshal.StringToBSTR("11111");
给Knight94(愚翁) ,liujia_0421(SnowLover) ,cancerser(都是混饭吃,记得要结帖),hdt(倦怠)
等等大哥们,先磕个头了。。等我一个个试完再上来磕头
我对C#一窍不通,,,,,
是我同事帮我建了个工程让我依葫芦画瓢着玩得。。麻烦哪位把建议包含在代码里好吗。。^_^using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.InteropServices;//这是用到DllImport时候要引入的包
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
mdk5("111111111111");
}
[DllImport("mdd.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
public static extern int mdk5(string sn);
}
}
c#俺真的不懂啊。您能帮我加到代码中吗。谢谢啊
cancerser(都是混饭吃,记得要结帖)您在北京吗?搞定的话俺周六请你到我家楼下吃全聚德啊,
亚运村店。。
*/
hdt大哥好像离亚运村不远,你可以请他吃全聚德,呵呵~
using System.Text;
private void button1_Click(object sender, EventArgs e)
{
StringBuilder sBuffer = new StringBuilder("111111111111", 256 );
mdk5( sBuffer );
}
[DllImport("mdd.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
public static extern int mdk5(StringBuilder sn);
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.InteropServices;//这是用到DllImport时候要引入的包
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
IntPtr bstr = StringToBSTR("111111111111");
mdk5(bstr);
}
[DllImport("mdd.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
public static extern int mdk5( IntPtr bstr );
}
}
private void button1_Click(object sender, EventArgs e)
{
IntPtr bstr = Marshal.StringToBSTR("111111111111");
mdk5(bstr);
}
[DllImport("mdd.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
public static extern int mdk5( IntPtr bstr );
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.InteropServices;//这是用到DllImport时候要引入的包
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
StringBuilder sn = new StringBuilder(256);
sn="11111111"
mdk5(sn);
}
[DllImport("mdd.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)] public static extern int mdk5(StringBuilder sn);
}
}
555555555
StringBuilder sn = new StringBuilder(256);
sn="11111111"with
StringBuilder sn = new StringBuilder( "11111111",256);
我的MDK5在VB中可以引用自如啊。难道VB做的所谓的标准DLL真的还有很大局限性???namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
StringBuilder sn = new StringBuilder("11111111", 256);
mdk5(sn);
}
[DllImport("mdd.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)] public static extern int mdk5(StringBuilder sn);
估计差不多,VB做的只是有输出函数的ActiveX DLL,并非真的标准DLL
不过通过LINK.EXE方法真的可以让c++和vb自己直接用阿。我试验个了。这个DLL在C#中却碰到这么多问题晕啊。。我发现我真的太背啦。。当初偷懒学了已经过时了的VB。
你直接在c#中进行调用是否可以,把vb包的那层去掉
老大,能具体点怎么操作的吗?谢谢
如果有问题可能是向viena 所说的vb作的dll还不是绝对的标准dll。
改变方法,vb作activex dll c#引用。如果没有问题说明,只是参数类型转换的问题,不知vb6调试可不可以看到变量的具体在内存中的表示,如果可以看看传入的参数和vb标准string有何区别
我对C#也不熟悉 ,NND 按排我做 BIZTALK 的RFID中间件
不知道领导怎么想的郁闷的一米
而MS的所谓架构师 估计对G2的协议不咋的熟悉