C编的dll中char函数的使用方法在C中返回值类型为char*的在vb.net里如何接收为string

vb.net调用vc++写的dll的问题-中国学网-中国IT综合门户网站
> 信息中心 >
vb.net调用vc++写的dll的问题
来源:互联网 发表时间: 9:09:13 责任编辑:王亮字体:
为了帮助网友解决“vb.net调用vc++写的dll的问题”相关的问题,中国学网通过互联网对“vb.net调用vc++写的dll的问题”相关的解决方案进行了整理,用户详细问题包括:vb.net东软医保动态库DLL我是个vb.net新手,最近写一个医院管理系统,其中需要调用医保接口,我们这里的医保是东软的,只提供了动态库方式连接,并且提供了文档,但并未提供其他语言调用的DEMO,文档中是这样写的:1.2BUSINESS_HANDLE&业务函数1.2.1语法规则&Syntax:对外提供接口:SiInterface.dllint&WINAPI&BUSINESS_HANDLE(const&char*&inputData,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&char*&outputData)输入参数:inputData&&输出参数:outputData&char*&返回值:&成功&0&&&&失败&-1&&&&输入参数是以“^、$、|”分割的字符串输出也是以“^”“@、^、$、|”分割的字符串我在调用DLL的时候是这样写的:Public&Class&DLLImports&&&&&DllImport("SiInterface.dll",&EntryPoint:="INIT")&&Public&Shared&Function&INIT(ByVal&OutputInfo&As&String)&As&Integer&&&&End&Function&&&&&DllImport("SiInterface.dll",&EntryPoint:="BUSINESS_HANDLE")&&Public&Shared&Function&BUSINESS_HANDLE(ByVal&inputData&As&String,&&Out&&ByVal&outputData&As&String)&As&Integer&&&&End&FunctionEnd&Class在程序中测试调用DLL中的函数是这样写的:&&Dim&inputdata&As&String&&&&&&&&&&&&Dim&l_outputdata&As&String&&&&&&&&&&&&Dim&result&As&Integer&&&&&&&&&&&&&&&&&&&&&&&inputdata&=&"37^^2007010^^|^"&&&&&&&&&&&&l_outputdata&=&Space(100)&&&&&&&&&&&&result&=&BUSINESS_HANDLE(inputdata,&l_outputdata)&&&&&&&&&&&&If&result&&&&0&Then&&&&&&&&&&&&&&&&System.Console.WriteLine("医保返回值:"&&&l_outputdata)&&&&&&&&&&&&End&If&&&&&&&&&&&&System.Console.WriteLine("返回值:"&&&result)现在出现的问题是这样的:在调用这个动态库中的函数的时候会有一个输出的日志,调用时可以正常运行,但是调用BUSINESS_HANDLE(const&char*&inputData,&&char*&outputData)函数中的输出参数的时候,不能正确显示出输出参数中的内容,我&不知道是我调用的方法不对还是怎样?请各位高手指点一下!谢谢!,具体解决方案如下:解决方案1:请参考:http://bbs.csdn.net/topics/解决方案2:引用&楼主&yushihai&的回复:我是个vb.net新手,最近写一个医院管理系统,其中需要调用医保接口,我们这里的医保是东软的,只提供了动态库方式连接,并且提供了文档,但并未提供其他语言调用的DEMO,文档中是这样写的:1.2BUSINESS_HANDLE&业务函数1.2.1语法规则&Syntax:对外提供接口:SiInterface.dllint&WINAPI&BUSINESS_HANDLE(const&char*&inputData,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&char*&outputData)输入参数:inputData&&输出参数:outputData&char*&返回值:&成功&0&&&&失败&-1&&&&输入参数是以“^、$、|”分割的字符串输出也是以“^”“@、^、$、|”分割的字符串我在调用DLL的时候是这样写的:Public&Class&DLLImports&&&&&DllImport("SiInterface.dll",&EntryPoint:="INIT")&&Public&Shared&Function&INIT(ByVal&OutputInfo&As&String)&As&Integer&&&&End&Function&&&&&DllImport("SiInterface.dll",&EntryPoint:="BUSINESS_HANDLE")&&Public&Shared&Function&BUSINESS_HANDLE(ByVal&inputData&As&String,&&Out&&ByVal&outputData&As&String)&As&Integer&&&&End&FunctionEnd&Class在程序中测试调用DLL中的函数是这样写的:&&Dim&inputdata&As&String&&&&&&&&&&&&Dim&l_outputdata&As&String&&&&&&&&&&&&Dim&result&As&Integer&&&&&&&&&&&&&&&&&&&&&&&inputdata&=&"37^^2007010^^|^"&&&&&&&&&&&&l_outputdata&=&Space(100)&&&&&&&&&&&&result&=&BUSINESS_HANDLE(inputdata,&l_outputdata)&&&&&&&&&&&&If&result&&&&0&Then&&&&&&&&&&&&&&&&System.Console.WriteLine("医保返回值:"&&&l_outputdata)&&&&&&&&&&&&End&If&&&&&&&&&&&&System.Console.WriteLine("返回值:"&&&result)现在出现的问题是这样的:在调用这个动态库中的函数的时候会有一个输出的日志,调用时可以正常运行,但是调用BUSINESS_HANDLE(const&char*&inputData,&&char*&outputData)函数中的输出参数的时候,不能正确显示出输出参数中的内容,我&不知道是我调用的方法不对还是怎样?请各位高手指点一下!谢谢!补充一点:outputdata是输出参数,即当调用dll中BUSINESS_HANDLE(const&char*&inputData,&&char*&outputData)函数完成后,这个函数不但会返回一个integer的整数,还会封装一个字符串通过outputData返回,我现在是想调用outputData里的值解决方案3:同问:楼主会了吗,有时间贴出来呗。我也在做这个,调用C++写的dll,我用的是vb.net2010解决方案4:引用&3&楼&guangzi8531&的回复:同问:楼主会了吗,有时间贴出来呗。我也在做这个,调用C++写的dll,我用的是vb.net2010正常函数的返回值是没问题的,只是这个函数里有一个传出参数,不知道怎么调用这个传出函数解决方案5:引用&3&楼&guangzi8531&的回复:同问:楼主会了吗,有时间贴出来呗。我也在做这个,调用C++写的dll,我用的是vb.net2010已经解决了,虽然楼上的各位没能解决,但是十分感谢!应3楼要求,贴出我的代码:调用Dll文件,需要注意的是要导入System.Runtime.InteropServices和System.Text:&&&&DllImport("SiInterface.dll",&EntryPoint:="INIT")&&Public&Shared&Function&INIT(ByVal&OutputInfo&As&String)&As&Integer&&&&End&Function&&&&&DllImport("SiInterface.dll",&EntryPoint:="BUSINESS_HANDLE")&&Public&Shared&Function&BUSINESS_HANDLE(ByVal&inputData&As&String,&&Out&&ByVal&outputData&As&StringBuilder)&As&Integer&&&&End&Function调用DLL中函数,并读取函数中的传出函数代码:&Private&Sub&Button1_Click(sender&As&Object,&e&As&EventArgs)&Handles&Button1.Click&&&&&&&&Try&&&&&&&&&&&&Dim&inputdata&As&String&&&&&&&&&&&&'&Dim&l_outputdata&As&String&&&&&&&&&&&&Dim&l_outputdata&As&New&Stringbuilder()&&&&&&&&&&&&Dim&result&As&Integer&&&&&&&&&&&&'&&l_outputdata&=&Nothing&&&&&&&&&&&&inputdata&=&Space(10240)&&&&&&&&&&&&inputdata&=&"37^^2007010^^|^"&&&&&&&&&&&&l_outputdata.Capacity&=&1024&&&&&&&&&&&&System.Console.WriteLine("输入值:"&&&inputdata)&&&&&&&&&&&&result&=&BUSINESS_HANDLE(inputdata,&l_outputdata)&&&&&&&&&&&&If&result&&&&0&Then&&&&&&&&&&&&&&&&System.Console.WriteLine("医保返回值:"&&&l_outputdata.ToString())&&&&&&&&&&&&End&If&&&&&&&&&&&&System.Console.WriteLine("返回值:"&&&result)&&&&&&&&Catch&ex&As&Exception&&&&&&&&&&&&MessageBox.Show(ex.ToString())&&&&&&&&End&Try&&&&End&Sub运行结果:输入值:37^^2007010^^|^医保返回值:^^执行EapAgent_SendRequest()时错误.请检查网络连接状况!^返回值:-4
3个回答1个回答2个回答1个回答3个回答1个回答1个回答1个回答2个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答
相关文章:
最新添加资讯
24小时热门资讯
Copyright © 2004- All Rights Reserved. 中国学网 版权所有
京ICP备号-1 京公网安备02号请教在C#里面如何调用Delphi的DLL中的一个输出函数并返回字符串?(在Delphi中参数是PChar类型对应C#是String吗)
请问在C#里面怎么调用Delphi的DLL中的一个输出函数并返回字符串?(在Delphi中参数是PChar类型对应C#是String吗)RT.我在C#中调用DELPHI的一个DLL,有一个返回类型是 PCHAR的函数,我在C#中用string,stringBuilder返回都为NULL,用int,long,IntPtr返回都为0,可同样的DLL我在VB & 6.0里面引用却很好.不过在VB & 6.0里面我用string 对应 Pchar也只能得到返回字符串的地址,后来被我用API从进程内存中读到了返回的字符串值,呵呵~
但是在C#.NET & 和 VB.NET 中我试着调用这个函数,却不能正确返回字符串(PCHAR类型),请高手指教!谢谢~------解决方案--------------------------------------------------------byte[] or char[]
参数的话加上ref
------解决方案--------------------------------------------------------Delphi中是如何声明的?
文章评论 以下网友留言只代表其个人观点,不代表本网站的观点和立场。在vb中如何得到dll返回的char*类型的值??
[问题点数:20分,结帖人qaymuic]
在vb中如何得到dll返回的char*类型的值??
[问题点数:20分,结帖人qaymuic]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2003年4月 荣获微软MVP称号
2002年12月 VB大版内专家分月排行榜第一2002年11月 VB大版内专家分月排行榜第一2002年10月 VB大版内专家分月排行榜第一2002年9月 VB大版内专家分月排行榜第一2002年8月 VB大版内专家分月排行榜第一2002年7月 VB大版内专家分月排行榜第一2002年6月 VB大版内专家分月排行榜第一2002年5月 VB大版内专家分月排行榜第一
2003年4月 荣获微软MVP称号
2002年12月 VB大版内专家分月排行榜第一2002年11月 VB大版内专家分月排行榜第一2002年10月 VB大版内专家分月排行榜第一2002年9月 VB大版内专家分月排行榜第一2002年8月 VB大版内专家分月排行榜第一2002年7月 VB大版内专家分月排行榜第一2002年6月 VB大版内专家分月排行榜第一2002年5月 VB大版内专家分月排行榜第一
2003年4月 荣获微软MVP称号
2002年12月 VB大版内专家分月排行榜第一2002年11月 VB大版内专家分月排行榜第一2002年10月 VB大版内专家分月排行榜第一2002年9月 VB大版内专家分月排行榜第一2002年8月 VB大版内专家分月排行榜第一2002年7月 VB大版内专家分月排行榜第一2002年6月 VB大版内专家分月排行榜第一2002年5月 VB大版内专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。17:36 提问
用vb.net(或C#)调用C++编写的DLL时遇到的问题
这部分是在c++中可以正常工作的部分,其声明如下:
extern "C" int LHD_Main(unsigned char *pImage, RECT *rcRoi,int w, int h, char *PlateCharacters, RECT *rectPlateLocation, int *PlateReliability, int nMod);
//加载图片
IplImage *image = cvLoadImage(file_name,-1);
if (image == NULL)
printf("image is not exist!\n");
return -1;
unsigned char *pRawData = (unsigned char *)malloc(image-&width*image-&height*image-&nChannels);
if (NULL == pRawData)
printf("memalloc error\n");
return -1;
int pitch = image-&nChannels*image-&
int width = image-&
int height = image-&
//转换成3通道图像
for (int y = 0; y & image-& y++)
for (int x = 0; x &image-& x++)
*(pRawData + y*pitch + 3*x)
= ((unsigned char *)(image-&imageData + image-&widthStep*y))[3*x];
*(pRawData + y*pitch + 3*x + 1) = ((unsigned char *)(image-&imageData + image-&widthStep*y))[3*x+1];
*(pRawData + y*pitch + 3*x + 2) = ((unsigned char *)(image-&imageData + image-&widthStep*y))[3*x+2];
char cFileName[128];
sprintf_s(cFileName,"%s","京");
cProvince[0] = cFileName[0];
cProvince[1] = cFileName[1];
LHD_Init(LPR_WIDTH, LPR_HEIGHT, cProvince);
//start license plate recognition module,宽高减少1是图像坐标从0开始
RECT recttROI = {0,0,image-&width -1, image-&height- 1};//设置区域
RECT rectPlate = {0,0,0,0};//输出定位结果
RECT rectTmp
= {0,0,0,0};
int nblePlate = 0;//
char HPHM[128] = {'0'};//
char mHPHM[128] = {'0'};
mnblePlate = 0;
bool m_bLPR
if(LHD_Main(pRawData,&recttROI,width,height, HPHM, &rectTmp,&nblePlate, i))
这些代码是可以正常工作的。
下面我在VB.NET中如此声明
&DllImport("LPR.dll", EntryPoint:="LHD_Main", CallingConvention:=CallingConvention.Cdecl)& _
Public Shared Function LHD_Main(ByRef pImage As Byte, ByRef rcRoi As RECT, ByVal w As Int32, ByVal h As Int32, ByRef PlateCharacters As Byte, ByRef rectPlateLocation As RECT, ByRef PlateReliability As Int32, ByVal nMod As Integer) As Int32
End Function
Public Structure RECT
Dim left As Int32
Dim top As Int32
Dim right As Int32
Dim bottom As Int32
End Structure
Dim cProvince(1) As byte
cProvince(0) = &HBE
cProvince(1) = &HA9
LHD_Init(768, 288, cProvince(0))
Dim path As String = "d:\pic\rtemp.jpg"
Dim rImage As IntPtr = Emgu.CV.CvInvoke.cvLoadImage(path, Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_COLOR)
Dim mImage As Emgu.CV.Structure.MIplImage = CType(System.Runtime.InteropServices.Marshal.PtrToStructure(rImage, GetType(Emgu.CV.Structure.MIplImage)), Emgu.CV.Structure.MIplImage)
Dim RawData(mImage.width * mImage.height * mImage.nChannels)
Dim TempData(mImage.imageSize) As Byte
Marshal.Copy(mImage.imageData, TempData, 0, mImage.imageSize)
Dim p = mImage.nChannels * mImage.width
Dim w = mImage.width
Dim h = mImage.height
'转换成3通道图像
For y = 0 To h - 1
For x = 0 To w - 1
RawData(y * p + 3 * x) = TempData(3 * x + mImage.widthStep * y)
RawData(y * p + 3 * x + 1) = TempData(3 * x + mImage.widthStep * y + 1)
RawData(y * p + 3 * x + 2) = TempData(3 * x + mImage.widthStep * y + 2)
Dim recttROI As New RECT
recttROI.left = 0
recttROI.top = 0
recttROI.right = mImage.width - 1
recttROI.bottom = mImage.height - 1
Dim rectPlate As New RECT
Dim rectTmp As New RECT
Dim mnblePlate As Integer = 0
Dim HPHM(127) As Byte
Dim rw As Integer = mImage.width
Dim rh As Integer = mImage.height
For i = 0 To 8
Dim result As Integer = LHD_Main(RawData(0), recttROI, rw, rh, HPHM(0), rectTmp, mnblePlate, i)
运行后在LHD_Main处报错: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
求问怎么解决!
按赞数排序
注意参数是否正确,尤其类型。
多数是编译上的问题,你的DLL是x86的,所以要设置:编译& 高级编译选项& 目标CPU ,设置为 X86 就可以解决问题了。
其他相似问题}

我要回帖

更多关于 C加加中的char 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信