c++ builder 中结构体的定义如下:
struct VaStr //变量结构体
{public:
long VId;
char *VName;
char *VValue;
char *VType;
char *VDescrip; //构造函数
VaStr(); //拷贝构造函数
VaStr(VaStr&); //析构函数
~VaStr();
};c++调用函数如下:
//获取所有变量的信息
extern "C" __declspec (dllexport) int __stdcall GetVariable(VaStr *PPVaStr,long length);
请问c#中对应的代码怎么写?
在网上找个很多,但都有很多问题。
struct VaStr //变量结构体
{public:
long VId;
char *VName;
char *VValue;
char *VType;
char *VDescrip; //构造函数
VaStr(); //拷贝构造函数
VaStr(VaStr&); //析构函数
~VaStr();
};c++调用函数如下:
//获取所有变量的信息
extern "C" __declspec (dllexport) int __stdcall GetVariable(VaStr *PPVaStr,long length);
请问c#中对应的代码怎么写?
在网上找个很多,但都有很多问题。
解决方案 »
- Webbrowser 如何打开新窗口 相当Ctrl+N
- 多个RadioButtonList和checkbuttonlist做选择项后处理选择值
- 请教各位,帮帮忙啊
- 请问:.net应用程序发布时候检测.netFrameWork的问题
- WebBrowser的问题,如何对段落样式控制,就像Outlook Express 中的editor
- DataGrid中定义的textbox的双击事件怎么每次都运行两次?
- 毕业以后有必要去培训机构学习.net吗
- C# DirectX Video播放时各类事件无法触发
- JSON如何取值
- 如何在运行时让任务栏不可见?在线等
- winform listview 如何在点击时取得该点击位置所属的列的columnheader的name值
- 关于一个正则表达式 求分析
1、结构体:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct VaStr
{
public int VId; //注意long在C++是4个字节,在C#是8个字节
public string VName;
public string VValue;
public string VType;
public string VDescrip;
}2、函数声明:
[DllImport("xxxx.dll",CharSet=CharSet.Ansi, CallingConvention=CallingConvention.StdCall)]
public static extern int GetVariable(ref VaStr PPVaStr,int length);
你要用C#些代码测试
在调用时向c++的函数传递 结构体的指针,我在c++函数中调试,想看看传的参数是否正确,结果出来那样的错误!
如果你详细了解c++ builder 生成二进制编码中那个类的内存布局,还有可能调用,否则,算了吧
我说的是:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct VaStr
{
public int VId; //注意long在C++是4个字节,在C#是8个字节
public string VName;
public string VValue;
public string VType;
public string VDescrip;
}
[DllImport("xxxx.dll",CharSet=CharSet.Ansi, CallingConvention=CallingConvention.StdCall)]
public static extern int GetVariable(ref VaStr PPVaStr,int length);还有你的调用代码全部要在C#中!你把这些代码贴出,我来看看
结构体声明:
[StructLayout(LayoutKind.Sequential), CharSet = CharSet.Ansi]
public struct VaStr
{
public int VId;
//[MarshalAsAttribute(UnmanagedType.LPTStr)]
public string VName;
// [MarshalAsAttribute(UnmanagedType.LPTStr)]
public string VValue;
//[MarshalAsAttribute(UnmanagedType.LPTStr)]
public string VType;
// [MarshalAsAttribute(UnmanagedType.LPTStr)]
public string VDescrip;
}
函数声明:
/// <summary>
/// 获取所有变量的信息
/// </summary>
/// <param name="PPVaStr">VaStr变量数组</param>
/// <param name="length">数组长度</param>
/// <returns></returns>
[DllImportAttribute(DLL_NAME, CharSet = CharSet.Ansi, EntryPoint = "GetVariable", CallingConvention = CallingConvention.StdCall)]
public static extern int GetVariable(ref VaStr[] PPVaStr, long length);函数使用:
VaStr[] vaStrFromDLL = new VaStr[200];
EcsHandle.GetVariable(ref vaStrFromDLL, 200);c++中函数定义如下:
int __stdcall GetVariable(VaStr *PPVaStr,long length)
{
try
{
if(static_cast<unsigned long>(length)>AllVaVector.size()) length=AllVaVector.size(); int i; //此次赋值时出现上面的错误
for(i=0;i<length;i++)
{
PPVaStr[i].VId=(AllVaVector[i])->VId; strcpy(PPVaStr[i].VName,(AllVaVector[i])->VName); strcpy(PPVaStr[i].VValue,(AllVaVector[i])->VValue); strcpy(PPVaStr[i].VType,(AllVaVector[i])->VType); strcpy(PPVaStr[i].VDescrip,(AllVaVector[i])->VDescrip);
} }
}
catch(...)
{
return -1;
} return 1;}
[DllImportAttribute(DLL_NAME, CharSet = CharSet.Ansi, EntryPoint = "GetVariable", CallingConvention = CallingConvention.StdCall)]
public static extern int GetVariable([In,Out]VaStr[] PPVaStr, long length);测试:
VaStr[] vaStrFromDLL = new VaStr[1];
vaStrFromDLL[0].VId =1;
vaStrFromDLL[0].VName="aa";
vaStrFromDLL[0].VValue="44";
vaStrFromDLL[0].VType=""10;
vaStrFromDLL[0].VDescrip="desc";
EcsHandle.GetVariable(ref vaStrFromDLL, 1);先用一个数组测试,后面逐步加多!