真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

vb.net中dll傳數(shù) vbnet調(diào)用vc++ dll

vb.net如何與c語(yǔ)言做的dll互相傳遞字符串

首先是C的DLL(我的項(xiàng)目叫ConsoleApplication2.dll):

在烈山等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶(hù)提供網(wǎng)站制作、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需設(shè)計(jì)網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),營(yíng)銷(xiāo)型網(wǎng)站,外貿(mào)網(wǎng)站制作,烈山網(wǎng)站建設(shè)費(fèi)用合理。

#include?Windows.h

//?導(dǎo)出Test函數(shù),供外部使用

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項(xiàng)目:

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

運(yùn)行結(jié)果:

VB.NET如何傳遞字符串給VC++編寫(xiě)的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傳遞數(shù)組的問(wèn)題

把聲明

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)

也就是說(shuō)把兩個(gè)byref改成byval就行了

這樣雖然是用的byval但是傳進(jìn)去的依然是指針

你在C里對(duì)outarr數(shù)組的修改 在VB里也確實(shí)會(huì)被修改

具體為什么 我也不太清楚 可能得從編譯原理的角度去解釋

我這樣做只是憑經(jīng)驗(yàn)

因?yàn)槲易鲞^(guò)很多VC寫(xiě)的dll供VB調(diào)用的程序

你就這樣改 聽(tīng)我的 沒(méi)錯(cuò)的

VB調(diào)用dll函數(shù),需要傳遞 數(shù)組的地址(數(shù)組中存放的是IP地址)

先說(shuō)說(shuō)VC++的編程。首先在VC++中生成Win32 DLL工程。在這個(gè)工程中添加幾個(gè)函數(shù)供VB用戶(hù)調(diào)用。一個(gè)DLL中的函數(shù)要想被VB調(diào)用,必須滿(mǎn)足兩個(gè)條件:一是調(diào)用方式為stdcall,另一個(gè)是必須是export的。要做到第一條,只須在函數(shù)聲明前加上__stdcall關(guān)鍵字。如:

short __stdcall sample(short nLen, short *buffer)

要做到第二條,需要在*.def文件中加上如下的幾行:

EXPORTS

sample @1

這里的sample是你要在VB中調(diào)用的函數(shù)名,@1表示該函數(shù)在DLL中的編號(hào),每個(gè)函數(shù)都不一樣。注意這里的函數(shù)名是區(qū)分大小寫(xiě)的。至于你說(shuō)的需要傳遞大量數(shù)據(jù),可以這樣做,在VB中用一個(gè)數(shù)組存放數(shù)據(jù),然后將該數(shù)組的大小和地址傳給VC(至于如何在VB中編程我會(huì)在下面介紹)。就象上面的例子,nLen是數(shù)組大小,buffer是數(shù)組地址,有了這兩條,你可以象使用VC的數(shù)組一樣進(jìn)行處理了。至于輸出圖形,可以生成WMF或BMP格式,讓VB調(diào)用。不過(guò),我認(rèn)為也可以直接輸出到視窗,只要VB將窗口的句柄hWnd和hDC以及視窗的繪圖位置(VB和VC采用的坐標(biāo)系必須一致才行)傳給VC就行了。而VB的AutoRedraw屬性必須為False,在Paint事件中調(diào)用VC的繪圖程序。

再談?wù)刅B的編程。VB調(diào)用DLL的方法和調(diào)用Windows API的方法是一樣的,一般在VB的書(shū)中有介紹。對(duì)于上面一個(gè)例子,先要聲明VC函數(shù):

Declare Function sample Lib "mydll.dll" (ByVal nLen As Integer, buffer As Integer) As Integer

這里mydll.dll是你的dll的名字。你可能已經(jīng)注意到了兩個(gè)參數(shù)的聲明有所不同,第一個(gè)參數(shù)加上了ByVal。規(guī)則是這樣的:如果在VC中某個(gè)參數(shù)聲明為指針和數(shù)組,就不加ByVal,否則都要加上ByVal。在VB中調(diào)用這個(gè)函數(shù)采用這樣的語(yǔ)法:

sample 10, a(0)

這里的a()數(shù)組是用來(lái)存放數(shù)據(jù)的,10為數(shù)組長(zhǎng)度,這里的第二個(gè)參數(shù)不能是a(),而必須是要傳遞的數(shù)據(jù)中的第一個(gè)。這是VB編程的關(guān)鍵。

下面在說(shuō)幾個(gè)可能遇到的問(wèn)題。一個(gè)問(wèn)題是VB可能報(bào)告找不到dll,你可以把dll放到system目錄下,并確保VB的Declare語(yǔ)句正確。另一個(gè)問(wèn)題是VB報(bào)告找不到需要的函數(shù),這通常是因?yàn)樵赩C中*.def文件沒(méi)設(shè)置。第三種情況是VB告訴不能進(jìn)行轉(zhuǎn)換,這可能是在VC中沒(méi)有加上__stdcall關(guān)鍵字,也可能是VB和VC的參數(shù)類(lèi)型不一致,注意在VC中int是4個(gè)字節(jié)(相當(dāng)于VB的Long),而VB的Integer只有2個(gè)字節(jié)。必須保證VB和VC的參數(shù)個(gè)數(shù)相同,所占字節(jié)數(shù)也一致。最后一個(gè)要注意的問(wèn)題是VC中絕對(duì)不能出現(xiàn)數(shù)組越界的情況,否則會(huì)導(dǎo)致VB程序崩潰。

總的來(lái)說(shuō),你和你的伙伴需要一些時(shí)間來(lái)進(jìn)行協(xié)調(diào)和摸索,但這種方法絕對(duì)可行,也不難掌握。

vb.net 調(diào)用C++ DLL,傳遞動(dòng)態(tài)數(shù)組

微軟給出的例子

C#的例子

我有互操作的書(shū)籍,你需要的話(huà),可以給我百度消息,發(fā)給你!

你試試下面這個(gè),我記得不是很清楚了,shared不行就用auto

DllImport(\"XXX.dll\")

Private Shared Function GetDataArray (ByRef _Array As long, ByVal len As Integer) As Boolean

你試試看吧,家里沒(méi)有環(huán)境,有問(wèn)題明天給你看吧


分享文章:vb.net中dll傳數(shù) vbnet調(diào)用vc++ dll
文章URL:http://weahome.cn/article/hidijs.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部