C++代码转C#,转换与传递参数,共享内存,不知道如何写

kernel001 2011-12-08 08:24:13
#define EVENTDELAY 3 //延时
#define XYRUNSPEED 10 //x,y运动速度
#define IO_INPUT 11 //输入IO检测
#define IO_OUTPUT 12 //输出IO检测
#define LINECOORSPACE 24 //运动到某位置
#define ResetMethod 29 //复位动作
#define ZUAxesSpeedS 40 //Z,U轴速度

#define XY_Move_Offset 206 //相对位置移动
#define XYZ_Move_s 208 //三轴联动移动

typedef struct _WORKFILE_
{
long filehead;
unsigned long x;//假如是文件索引,则保存序号
unsigned long y;//假如是文件索引,则保存WORKINS位置
unsigned long z;
unsigned long u;

}WORKFILE;

#define Mac_Coor_LT 0
#define Mac_Coor_RT 1
#define Mac_Coor_LD 2
#define Mac_Coor_RD 3

typedef BOOL(WINAPI*YM_DataProce)(long method,LPCTSTR path,void*lpData,double mapwi,double maphi,long coormethod);

void CShowtestDlg::OnButton2()
{
rwFiles rw;
CString strLangFilePath,path,filepath;
LPTSTR szAppPath = strLangFilePath.GetBuffer(_MAX_PATH);
GetModuleFileName(NULL,szAppPath,_MAX_PATH);
strLangFilePath.ReleaseBuffer();

strLangFilePath = strLangFilePath.Mid(0,strLangFilePath.ReverseFind(_T('\\')));

YM_DataProce tz_process;

path = strLangFilePath+"\\DigOut.dll";

disDll = LoadLibrary(path);

tz_process = (YM_DataProce)GetProcAddress(disDll,"YM_DataProcess");


if(rw.FileSavePathDlg(&filepath,"dig"))
{
BYTE * lpbuf = NULL;
WORKFILE*workf;

lpbuf = new BYTE[200];
workf = (WORKFILE*)lpbuf;

workf->filehead = 0;//第一个结构这个属性无意义,可为任何值
workf->x = 3;//表示后面跟3个结构
workf++;

workf->filehead = EVENTDELAY;
workf->x = 1000;//1秒
workf++;

workf->filehead = XYZ_Move_s;
workf->x = 5000;//x(微米)
workf->y = 20000;//y坐标(微米)
workf->z = 6000;//z坐标(微米)
workf++;

workf->filehead = XYZ_Move_s;
workf->x = 0;//x(微米)
workf->y = 0;//y坐标(微米)
workf->z = 0;//z坐标(微米)
workf++;

//注意第4,第5个参数是毫米单位
tz_process(0,filepath,lpbuf,5,20,Mac_Coor_LT);
}


//对应C#代码

public partial class Form1 : Form
{
private const int EVENTDELAY = 3; //延时
private const int XYRUNSPEED = 10;//x,y运动速度
private const int IO_INPUT = 11; //输入IO检测
private const int IO_OUTPUT = 12; //输出IO检测
private const int LINECOORSPACE = 24; //运动到某位置
private const int ResetMethod = 29; //复位动作
private const int ZUAxesSpeedS = 40;//Z,U轴速度

private const int XY_Move_Offset = 206; //相对位置移动
private const int XYZ_Move_s = 208; //三轴联动移动

[StructLayout(LayoutKind.Sequential)]
public struct WORKFILE
{
public int filehead;
public uint x;//假如是文件索引,则保存序号
public uint y;//假如是文件索引,则保存WORKINS位置
public uint z;
public uint u;
}

private const int Mac_Coor_LT = 0;
private const int Mac_Coor_RT = 1;
private const int Mac_Coor_LD = 2;
private const int Mac_Coor_RD = 3;



[DllImport("DigOut.dll", CharSet = CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.Bool)]//4 字节布尔值(true != 0、false = 0)。这是 Win32 BOOL 类型。
//public static extern bool YM_DataProcess(int method, string path, IntPtr lpData,
//double mapwi, double maphi, int coormethod);
public static extern bool YM_DataProcess(int method, string path, ref WORKFILE wf, double mapwi, double maphi, int coormethod);

//[DllImport("DigOut.dll", CharSet = CharSet.Unicode, SetLastError = true)]
//public static extern bool YM_DataProcess(int method, string path, IntPtr lpData,
// double mapwi, double maphi, int coormethod);

public Form1()
{
InitializeComponent();
}





private void button1_Click(object sender, EventArgs e)
{
//对应OnButton2()
//这一段不知道如何写 将内存传入到C++的DLL中。
//YM_DataProcess(1, "r:\\1.dig", ref WORKFILE, 0, 0, 0);
}
}

如果有需要 C的源代码可以向我索取。
...全文
176 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdl2005lyx 2011-12-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 kernel001 的回复:]

关键问题不在于这,而是Byte[] 类型等转换。
[/Quote]

转换什么?
C++与C#类型对应,MSDN有现成的,你查查就知道了。。。
sdl2005lyx 2011-12-08
  • 打赏
  • 举报
回复
为什么不直接把那段代码封装成API函数,供C#调用?

平台调用,互操作,最好只是设计结构、函数之间,
如果你要转换代码,相当于把C++的代码用C#重写了,
那根本就不用平台调用了。。。
jiuhexuan 2011-12-08
  • 打赏
  • 举报
回复
C++的指针,C#里引用对象都可以用,推荐你仔细研究下,c#里的引用对象的内存分配和C++的差异
freemangood 2011-12-08
  • 打赏
  • 举报
回复
这是我找到的 C++ 转换对应 C#
自己对照着改啊:

static_cast: 非强制转换,窄化转化,void*强制变换
const_cast:对const,volatile进行转换
reinterpret_cast:转换为完全不同的意思.
dynamic_caset:用于类型安全的向下转换.


static_cast<int>(i);
static_case<char>(i);



3. char* a[]
atoi,atol,atof分别把字符数组转换为int,long,float类型
atoi(a[1])

//C++中的DLL函数原型为
//extern "C" __declspec(dllexport) bool 方法名一(const char* 变量名1, unsigned char* 变量名2)
//extern "C" __declspec(dllexport) bool 方法名二(const unsigned char* 变量名1, char* 变量名2)

//C#调用C++的DLL搜集整理的所有数据类型转换方式,可能会有重复或者多种方案,自己多测试
//c++:HANDLE(void *) ---- c#:System.IntPtr
//c++:Byte(unsigned char) ---- c#:System.Byte
//c++:SHORT(short) ---- c#:System.Int16
//c++:WORD(unsigned short) ---- c#:System.UInt16
//c++:INT(int) ---- c#:System.Int16
//c++:INT(int) ---- c#:System.Int32
//c++:UINT(unsigned int) ---- c#:System.UInt16
//c++:UINT(unsigned int) ---- c#:System.UInt32
//c++:LONG(long) ---- c#:System.Int32
//c++:ULONG(unsigned long) ---- c#:System.UInt32
//c++:DWORD(unsigned long) ---- c#:System.UInt32
//c++:DECIMAL ---- c#:System.Decimal
//c++:BOOL(long) ---- c#:System.Boolean
//c++:CHAR(char) ---- c#:System.Char
//c++:LPSTR(char *) ---- c#:System.String
//c++:LPWSTR(wchar_t *) ---- c#:System.String
//c++:LPCSTR(const char *) ---- c#:System.String
//c++:LPCWSTR(const wchar_t *) ---- c#:System.String
//c++:PCAHR(char *) ---- c#:System.String
//c++:BSTR ---- c#:System.String
//c++:FLOAT(float) ---- c#:System.Single
//c++:DOUBLE(double) ---- c#:System.Double
//c++:VARIANT ---- c#:System.Object
//c++:PBYTE(byte *) ---- c#:System.Byte[]

//c++:BSTR ---- c#:StringBuilder
//c++:LPCTSTR ---- c#:StringBuilder
//c++:LPCTSTR ---- c#:string
//c++:LPTSTR ---- c#:[MarshalAs(UnmanagedType.LPTStr)] string
//c++:LPTSTR 输出变量名 ---- c#:StringBuilder 输出变量名
//c++:LPCWSTR ---- c#:IntPtr
//c++:BOOL ---- c#:bool
//c++:HMODULE ---- c#:IntPtr
//c++:HINSTANCE ---- c#:IntPtr
//c++:结构体 ---- c#:public struct 结构体{};
//c++:结构体 **变量名 ---- c#:out 变量名 //C#中提前申明一个结构体实例化后的变量名
//c++:结构体 &变量名 ---- c#:ref 结构体 变量名


//c++:WORD ---- c#:ushort
//c++:DWORD ---- c#:uint
//c++:DWORD ---- c#:int

//c++:UCHAR ---- c#:int
//c++:UCHAR ---- c#:byte
//c++:UCHAR* ---- c#:string
//c++:UCHAR* ---- c#:IntPtr

//c++:GUID ---- c#:Guid
//c++:Handle ---- c#:IntPtr
//c++:HWND ---- c#:IntPtr
//c++:DWORD ---- c#:int
//c++:COLORREF ---- c#:uint


//c++:unsigned char ---- c#:byte
//c++:unsigned char * ---- c#:ref byte
//c++:unsigned char * ---- c#:[MarshalAs(UnmanagedType.LPArray)] byte[]
//c++:unsigned char * ---- c#:[MarshalAs(UnmanagedType.LPArray)] Intptr

//c++:unsigned char & ---- c#:ref byte
//c++:unsigned char 变量名 ---- c#:byte 变量名
//c++:unsigned short 变量名 ---- c#:ushort 变量名
//c++:unsigned int 变量名 ---- c#:uint 变量名
//c++:unsigned long 变量名 ---- c#:ulong 变量名

//c++:char 变量名 ---- c#:byte 变量名 //C++中一个字符用一个字节表示,C#中一个字符用两个字节表示
//c++:char 数组名[数组大小] ---- c#:MarshalAs(UnmanagedType.ByValTStr, SizeConst = 数组大小)] public string 数组名; ushort

//c++:char * ---- c#:string //传入参数
//c++:char * ---- c#:StringBuilder//传出参数
//c++:char *变量名 ---- c#:ref string 变量名
//c++:char *输入变量名 ---- c#:string 输入变量名
//c++:char *输出变量名 ---- c#:[MarshalAs(UnmanagedType.LPStr)] StringBuilder 输出变量名

//c++:char ** ---- c#:string
//c++:char **变量名 ---- c#:ref string 变量名
//c++:const char * ---- c#:string
//c++:char[] ---- c#:string
//c++:char 变量名[数组大小] ---- c#:[MarshalAs(UnmanagedType.ByValTStr,SizeConst=数组大小)] public string 变量名;

//c++:struct 结构体名 *变量名 ---- c#:ref 结构体名 变量名
//c++:委托 变量名 ---- c#:委托 变量名

//c++:int ---- c#:int
//c++:int ---- c#:ref int
//c++:int & ---- c#:ref int
//c++:int * ---- c#:ref int //C#中调用前需定义int 变量名 = 0;

//c++:*int ---- c#:IntPtr
//c++:int32 PIPTR * ---- c#:int32[]
//c++:float PIPTR * ---- c#:float[]


//c++:double** 数组名 ---- c#:ref double 数组名
//c++:double*[] 数组名 ---- c#:ref double 数组名
//c++:long ---- c#:int
//c++:ulong ---- c#:int

//c++:UINT8 * ---- c#:ref byte //C#中调用前需定义byte 变量名 = new byte();


//c++:handle ---- c#:IntPtr
//c++:hwnd ---- c#:IntPtr


//c++:void * ---- c#:IntPtr
//c++:void * user_obj_param ---- c#:IntPtr user_obj_param
//c++:void * 对象名称 ---- c#:([MarshalAs(UnmanagedType.AsAny)]Object 对象名称



//c++:char, INT8, SBYTE, CHAR ---- c#:System.SByte
//c++:short, short int, INT16, SHORT ---- c#:System.Int16
//c++:int, long, long int, INT32, LONG32, BOOL , INT ---- c#:System.Int32
//c++:__int64, INT64, LONGLONG ---- c#:System.Int64
//c++:unsigned char, UINT8, UCHAR , BYTE ---- c#:System.Byte
//c++:unsigned short, UINT16, USHORT, WORD, ATOM, WCHAR , __wchar_t ---- c#:System.UInt16
//c++:unsigned, unsigned int, UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT ---- c#:System.UInt32
//c++:unsigned __int64, UINT64, DWORDLONG, ULONGLONG ---- c#:System.UInt64
//c++:float, FLOAT ---- c#:System.Single
//c++:double, long double, DOUBLE ---- c#:System.Double

//Win32 Types ---- CLR Type


//Struct需要在C#里重新定义一个Struct
//CallBack回调函数需要封装在一个委托里,delegate static extern int FunCallBack(string str);

//unsigned char** ppImage替换成IntPtr ppImage
//int& nWidth替换成ref int nWidth
//int*, int&, 则都可用 ref int 对应
//双针指类型参数,可以用 ref IntPtr
//函数指针使用c++: typedef double (*fun_type1)(double); 对应 c#:public delegate double fun_type1(double);
//char* 的操作c++: char*; 对应 c#:StringBuilder;
//c#中使用指针:在需要使用指针的地方加 unsafe


//unsigned char对应public byte
/*
* typedef void (*CALLBACKFUN1W)(wchar_t*, void* pArg);
* typedef void (*CALLBACKFUN1A)(char*, void* pArg);
* bool BIOPRINT_SENSOR_API dllFun1(CALLBACKFUN1 pCallbackFun1, void* pArg);
* 调用方式为
* [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
* public delegate void CallbackFunc1([MarshalAs(UnmanagedType.LPWStr)] StringBuilder strName, IntPtr pArg);
*
jiuhexuan 2011-12-08
  • 打赏
  • 举报
回复
List<workf> list=new List<workf>;
list.Add(new workf(0,3));
list.Add(new workf(EVENTDELAY,1000));

workf创建class,构造函数两个。
kernel001 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yanbuodiao 的回复:]

百度 谷歌 这个东西很多的 大体上是指针的 到c#中加ref关键字 其它的数据类型具体对应
[/Quote]

关键现在对这一段不了解,不知道如何转换。
[Quote]
BYTE * lpbuf = NULL;
WORKFILE*workf;

lpbuf = new BYTE[200];
workf = (WORKFILE*)lpbuf;

workf->filehead = 0;//第一个结构这个属性无意义,可为任何值
workf->x = 3;//表示后面跟3个结构
workf++;

workf->filehead = EVENTDELAY;
workf->x = 1000;//1秒
workf++;
[/Quote]
烟波钓 2011-12-08
  • 打赏
  • 举报
回复
百度 谷歌 这个东西很多的 大体上是指针的 到c#中加ref关键字 其它的数据类型具体对应
kernel001 2011-12-08
  • 打赏
  • 举报
回复
关键问题不在于这,而是Byte[] 类型等转换。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧