DLL 里的内容 
//数据报结构体 
struct DataPack 

unsigned char Addr_Set; 
unsigned char Main_Fun; 
unsigned char Sec_Fun; 
unsigned char Data_Len; 
unsigned char   Data[252]; 
}; DataPack _stdcall ReadInputState(int Adr,int StarAdr,int Entries) 

InitializeCriticalSection(&g_cs); 
EnterCriticalSection(&g_cs); 
DataPack Dpack; 
//结构体内容填充 
Dpack.Addr_Set=Adr; 
Dpack.Main_Fun=R_INPUTSTATE; 
Dpack.Sec_Fun=NONESECFUN; 
Dpack.Data_Len=4; 
Dpack.Data[0]=StarAdr>>8&0x00FF; //获取StarAdr高位数 
Dpack.Data[1]=StarAdr&0x00FF; //获取StarAdr低位数 
Dpack.Data[2]=Entries>>8&0x00FF; //获取EndAdr高位数 
Dpack.Data[3]=Entries&0x00FF; //获取EndAdr低位数 
COM_SndData((unsigned char *)(&Dpack),Dpack.Data_Len+4); 
Sleep(1); 
try 

memcpy(&Dpack,WhileRcv(),256); 

catch(...) 

Dpack.Main_Fun=0x00FF; 
} LeaveCriticalSection(&g_cs); 
return Dpack; 
} 以下是VB调用内容 
Private Type Datapack 
Adr As Variant 
MainFun As Variant 
SecFun As Variant 
DataLen As Variant 
Data() As Variant 
End Type Private Declare Function ReadInputState Lib "ModBusDll.dll" (ByVal x As Integer, ByVal y As Integer, ByVal z As Integer) As Datapack Private Sub Command1_Click() 
Dim DTpk As Datapack 
DTpk = ReadInputState(23, 0, 15)//执行到此句,程序退出,如果将DLL里的返回类型改为int的话就可以正常返回,返回结构体VB整个程序就会退出,无任何错误消息,请问高人,怎么解决? 
End Sub

解决方案 »

  1.   

    struct DataPack 

    unsigned char Addr_Set; 
    unsigned char Main_Fun; 
    unsigned char Sec_Fun; 
    unsigned char Data_Len; 
    unsigned char   Data[252]; 
    };  Private Type Datapack 
    Adr As Variant 
    MainFun As Variant 
    SecFun As Variant 
    DataLen As Variant 
    Data() As Variant 
    End Type  MS不对应,改一下参数类型
      

  2.   

    我也正在试验,发觉参数是有点问题,结构体是可以返回给VB用的,如果结构体里全部用int型的话,是可以返回的,比如一个结构体内定义两个int型,第一个可以正确返回,第二个就不能正确返回,估计是和VB和VC在内存里的数据长度有关!还在继续研究,等有了消息再发上来讨论下!谢谢楼上的
      

  3.   

    WINDOWS API里用结构体的地方很多,到网上找VB调用API的代码,看人家是怎么做的
      

  4.   

    知道怎么回事了,int在VC里内存占用4个字节,而VB的integer只占用2个字节,所以在定义VB的结构体时要把integer定义为long型就可以正确的接受数据了!unsigend char在VB里是不支持的,用对应长度的变量应该可以吧,还没试呢!再次谢谢楼上的