110,477
社区成员
发帖
与我相关
我的任务
分享
//我用C#调用C++ Build写的DLl时得不到正确返回,我同事使用VC6.0调用此DLL时就可以得到正确的返回,请问这是为何?传递的参数是一个结构体。代码如下:
//c++调用Dll并传递结构体地址:
TSS_Make_Data *SS_Make_Data;
TReadFromStream *ReadFromStream;
SS_Make_Data = (TSS_Make_Data *)GetProcAddress(Hinst,"SS_Make_Data");
ReadFromStream = (TReadFromStream *)GetProcAddress(Hinst,"ReadFromStream");
if(SS_Make_Data != NULL)
{
nFileLen = SS_Make_Data(¶m1);//param1是结构体
}
//C++ 中的结构体定义:
typedef struct
{
int TDH;
int Width;
int Height;
int Effect;
int Level;
int Speed;
int Delay;
int DataFont; //0-row 1-
int DataColor;
char * FontName;
bool IsCheckTime;
char * StartTime;
char * EndTime;
//----
char * DataString;
} TDataParam;
//C#中的DLL封装:
public class pArmMMData
{
/// <summary>
/// 将字符串生成图片
/// </summary>
/// <param name="t">要生成图片的节目的信息的结构体</param>
/// <returns>返回生成的字节数组的长度</returns>
[DllImport("pArmMMData.dll", EntryPoint = "SS_Make_Data")]
public static extern int SS_Make_Data(ref TDataParam t);
// public static extern int SS_Make_Data(TDataParam t);
/// <summary>
/// 获取生成的节目的字符数组的长度
/// </summary>
/// <param name="SendBuffer">返回的字节数组</param>
/// <param name="Length">要获取的长度(即SS_Make_Data方法的返回值)</param>
/// <returns></returns>
[DllImport("pArmMMData.dll", EntryPoint = "ReadFromStream")]
public static extern void ReadFromStream(byte[] SendBuffer, int Length);
}
//C#中的结构体定义
/// <summary>
/// 传递给DLL的结构体,标示一个实体的所有信息
/// </summary>
public struct TDataParam
{
/// <summary>
/// 节目编号
/// </summary>
public int TDH;
/// <summary>
/// 宽度
/// </summary>
public int Width;
/// <summary>
/// 高度
/// </summary>
public int Height;
/// <summary>
/// 显示效果
/// </summary>
public int Effect;
/// <summary>
/// 速度等级 0
/// </summary>
public int Level;
/// <summary>
/// 显示速度
/// </summary>
public int Speed;
/// <summary>
/// 停留时间
/// </summary>
public int Delay;
/// <summary>
/// 字号
/// </summary>
public int FontSize; //0-row 1-
/// <summary>
/// 颜色:0-红色,1-绿色,2-黄色
/// </summary>
public int DataColor;
/// <summary>
/// 字体
/// </summary>
public string FontName;
/// <summary>
/// 是否有时限
/// </summary>
public bool IsCheckTime;
/// <summary>
/// 时限-开始时间
/// </summary>
public string StartTime;
/// <summary>
/// 时限-结束时间
/// </summary>
public string EndTime;
/// <summary>
/// 要生成图片的字符串
/// </summary>
public string DataString;
}
//C#中的DLL调用:
TDataParam t = new TDataParam();//定义一个新的结构体实体
t.DataColor = 0;
t.DataString = textBox1.Text.Trim();
t.Delay = 0;
t.Effect = 15;
t.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
t.FontName = "宋体";
t.FontSize = 32;
t.Height = 32;
t.IsCheckTime = false;
t.Level = 0;
t.Speed = 3;
t.StartTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
t.TDH = 1;
t.Width = 128;
MessageBox.Show("结构体大小:" + Marshal.SizeOf(t).ToString());//此处返回56和VC++6.0中的sizeof返回值一样
int ilength = pArmMMData.SS_Make_Data(ref t);//此处调用DLL,返回值为0