vb.net中dll传数 vbnet调用vc++ dll
vb.net如何与c语言做的dll互相传递字符串
首先是C的DLL(我的项目叫ConsoleApplication2.dll):
在烈山等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站制作、成都网站制作 网站设计制作按需设计网站,公司网站建设,企业网站建设,品牌网站设计,营销型网站,外贸网站制作,烈山网站建设费用合理。
#include Windows.h
// 导出Test函数,供外部使用
extern "C" __declspec(dllexport) BSTR __cdecl Test(LPSTR p);
BOOL WINAPI DllMain(
HINSTANCE hinstDLL,
DWORD fdwReason,
LPVOID lpReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH: break;
case DLL_THREAD_ATTACH: break;
case DLL_THREAD_DETACH: break;
case DLL_PROCESS_DETACH: break;
}
return TRUE;
}
BSTR __cdecl Test(LPSTR p)
{
p[0] = 'X';
return SysAllocString((BSTR)p);
}
然后是VB.Net项目:
Imports System.Runtime.InteropServices
Imports System.Text
Module Module1
REM 生成的是ConsoleApplication2.dll,名字与C里面相同
DllImport("ConsoleApplication2.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.Cdecl)
Public Function Test(MarshalAs(UnmanagedType.LPTStr) ByVal str As StringBuilder) As MarshalAs(UnmanagedType.BStr) String
End Function
Sub Main()
Dim str As StringBuilder = New StringBuilder("Hello")
Dim rstr As String = Test(str)
Console.WriteLine(rstr)
Console.ReadKey()
End Sub
End Module
运行结果:
VB.NET如何传递字符串给VC++编写的DLL?
includeiostream
using namespace std;
char *deletechar(char *a)
{
int len=strlen(a);
char *b=new char();
int k=0;
for(int i=0;ilen;i++)
{
if(a[i]='0' a[i]='9')
{
b[k]=a[i];
k++;
}
}
VB向dll传递数组的问题
把声明
Declare Function Cal Lib "cal.dll" (ByRef inarr As Double, ByVal num As Long, ByRef outarr As Double)
改成
Declare Function Cal Lib "cal.dll" (ByVal inarr As Double, ByVal num As Long, ByVal outarr As Double)
也就是说把两个byref改成byval就行了
这样虽然是用的byval但是传进去的依然是指针
你在C里对outarr数组的修改 在VB里也确实会被修改
具体为什么 我也不太清楚 可能得从编译原理的角度去解释
我这样做只是凭经验
因为我做过很多VC写的dll供VB调用的程序
你就这样改 听我的 没错的
VB调用dll函数,需要传递 数组的地址(数组中存放的是IP地址)
先说说VC++的编程。首先在VC++中生成Win32 DLL工程。在这个工程中添加几个函数供VB用户调用。一个DLL中的函数要想被VB调用,必须满足两个条件:一是调用方式为stdcall,另一个是必须是export的。要做到第一条,只须在函数声明前加上__stdcall关键字。如:
short __stdcall sample(short nLen, short *buffer)
要做到第二条,需要在*.def文件中加上如下的几行:
EXPORTS
sample @1
这里的sample是你要在VB中调用的函数名,@1表示该函数在DLL中的编号,每个函数都不一样。注意这里的函数名是区分大小写的。至于你说的需要传递大量数据,可以这样做,在VB中用一个数组存放数据,然后将该数组的大小和地址传给VC(至于如何在VB中编程我会在下面介绍)。就象上面的例子,nLen是数组大小,buffer是数组地址,有了这两条,你可以象使用VC的数组一样进行处理了。至于输出图形,可以生成WMF或BMP格式,让VB调用。不过,我认为也可以直接输出到视窗,只要VB将窗口的句柄hWnd和hDC以及视窗的绘图位置(VB和VC采用的坐标系必须一致才行)传给VC就行了。而VB的AutoRedraw属性必须为False,在Paint事件中调用VC的绘图程序。
再谈谈VB的编程。VB调用DLL的方法和调用Windows API的方法是一样的,一般在VB的书中有介绍。对于上面一个例子,先要声明VC函数:
Declare Function sample Lib "mydll.dll" (ByVal nLen As Integer, buffer As Integer) As Integer
这里mydll.dll是你的dll的名字。你可能已经注意到了两个参数的声明有所不同,第一个参数加上了ByVal。规则是这样的:如果在VC中某个参数声明为指针和数组,就不加ByVal,否则都要加上ByVal。在VB中调用这个函数采用这样的语法:
sample 10, a(0)
这里的a()数组是用来存放数据的,10为数组长度,这里的第二个参数不能是a(),而必须是要传递的数据中的第一个。这是VB编程的关键。
下面在说几个可能遇到的问题。一个问题是VB可能报告找不到dll,你可以把dll放到system目录下,并确保VB的Declare语句正确。另一个问题是VB报告找不到需要的函数,这通常是因为在VC中*.def文件没设置。第三种情况是VB告诉不能进行转换,这可能是在VC中没有加上__stdcall关键字,也可能是VB和VC的参数类型不一致,注意在VC中int是4个字节(相当于VB的Long),而VB的Integer只有2个字节。必须保证VB和VC的参数个数相同,所占字节数也一致。最后一个要注意的问题是VC中绝对不能出现数组越界的情况,否则会导致VB程序崩溃。
总的来说,你和你的伙伴需要一些时间来进行协调和摸索,但这种方法绝对可行,也不难掌握。
vb.net 调用C++ DLL,传递动态数组
微软给出的例子
C#的例子
我有互操作的书籍,你需要的话,可以给我百度消息,发给你!
你试试下面这个,我记得不是很清楚了,shared不行就用auto
DllImport(\"XXX.dll\")
Private Shared Function GetDataArray (ByRef _Array As long, ByVal len As Integer) As Boolean
你试试看吧,家里没有环境,有问题明天给你看吧
文章标题:vb.net中dll传数 vbnet调用vc++ dll
链接地址:http://scyanting.com/article/hidijs.html