问题描述
这里有一个VC编写的dll文件,需要分别使用C#,和VB来进行调用文件中的数据结构及函数分别为:typedefstructAD_ITEM_FLAG{longADItemSize;longid;longADFlags;charPath[255];longisCut;longVolume;longPosition;longTimes;charContent[1000];longTimeLong;charTextFont[32];longFontSize;longFontColor;longXPosition;longYPosition;longNextADTime;}AD_ITEM;extern"C"long__stdcallget_ADItem(longADType,longADScene,AD_ITEM**pItem);我使用C#来进行调用比较正常,但是使用VB的时候就遇到问题了,VB里面使用的结构是PublicTypeAD_ITEM_FLAGADItemSizeAsLongidAsLongADFlagsAsLongPath(256)AsByteisCutAsLongvolumeAsLongPositionAsLongTimesAsLongContent(1000)AsByteTimeLongAsLongTextFont(32)AsByteFontSizeAsLongFontColorAsLongXPositionAsLongYPositionAsLongNextADTimeAsLongEndType使用的函数是PublicDeclareFunctionget_ADItemLib"ADSystem.dll"(ByValADTypeAsLong,ByValADSceneAsLong,pItem()AsAD_ITEM_FLAG)AsLong因为每次只返回一个结果,所以调用的方法是DimpItem(1)AsAD_ITEM_FLAGText2.text=get_ADItem(1,2,pItem)结果现在每次调用程序就崩溃报告“该内存不能为read”希望哪位兄弟能够帮助小弟!
解决方案
解决方案二:
路过,关注....
解决方案三:
up
解决方案四:
C#使用的方法跟这个类似能够正常运行,这个就不行了
解决方案五:
希望哪位兄弟帮忙
解决方案六:
调用结构体的时候是不是应该传地址byref
解决方案七:
对于自定义类型,VB默认就是byref
解决方案八:
哪位兄弟帮忙解答一下,不胜感激
解决方案九:
改成这样试试:PublicDeclareFunctionget_ADItemLib"ADSystem.dll"(ByValADTypeAsLong,ByValADSceneAsLong,ptrAsIntPtr)AsLongDimItemAsAD_ITEM_FLAGDimresultItemAsAD_ITEM_FLAGDimptrAsIntPtr=Marshal.AllocHGlobal(Marshal.SizeOf(Item))Marshal.StructureToPtr(Item,ptr,False)Text2.text=get_ADItem(1,2,ptr)resultItem=CType(Marshal.PtrToStructure(ptr,GetType(AD_ITEM_FLAG)),AD_ITEM_FLAG)Marshal.FreeHGlobal(ptr)
解决方案十:
小弟第一次用VB6.0,好像只有VB.net里面才有IntPtr以及Marshal这些东西吧,VB6.0里面有没有类似的东西?
解决方案十一:
哪位兄弟帮忙解答一下,不胜感激
解决方案十二:
吧dll的结构设置为public,vb中可以直接使用,不用在定义结构。
解决方案十三:
谢谢楼上的大哥我不是特别明白你的意思,这个dll是厂方提供的只有头文件可以看,头文件具体是//定义一个广告元素的结构体,用于返回值typedefstructAD_ITEM_FLAG{longADItemSize;//这个结构体占的字节数longid;//广告的idlongADFlags;//返回的广告有效字段标记,是AD_TEXT等字段的并集charPath[255];//广告的路径longisCut;//是否允许切换longVolume;//视频的音量longPosition;//广告的位置longTimes;//text的播放次数charContent[1000];//text广告的内容longTimeLong;//广告的时长charTextFont[32];//文本的字体longFontSize;//字体大小longFontColor;//字体的颜色,RGB值longXPosition;//X坐标longYPosition;//Y坐标longNextADTime;//下一个广告播放的时间间隔}AD_ITEM;不知道如何定义public
解决方案十四:
哪位兄弟帮忙解答一下,不胜感激
解决方案十五:
哪位兄弟帮忙解答一下,不胜感激