谢谢回答,我想还是帮我看下代码吧
我现在需要在c# 程序中把从c++ 得到的数据得到。
对于共享临时文本文件,我估计可能用不到。
c++ 的dll
下面是我的c++dll code 在testdll.h 文件中 typedef int ( _stdcall *API)();
typedef struct twi_context_
{
long callback_en;
API edriver_mm_comm_protocol;
API edriver_eui_mdio_comm_protocol;
API edriver_eui_i2c_comm_protocol;
API edriver_eui_gpio_comm_protocol;
char* edriver_comm_protocol_data;
char* api_message;
}twi_context ;
extern "C" {
_declspec(dllexport) long _stdcall edriver_mem_api(twi_context_ * twi_context);
};
在testdl.cpp 文件中 typedef long (_stdcall *API_comm_protocol)(twi_context_ * , long);
typedef long (_stdcall *API_eui_mdio_comm_protocol)(twi_context_ *, long);
typedef long (_stdcall *API_eui_i2c_comm_protocol)(twi_context_ *, long);
typedef long (_stdcall *API_eui_gpio_comm_protocol)(twi_context_ *, long);
long _stdcall cpp_comm_protocol(twi_context_ * twi_context, long flag)
{
long value = ((API_comm_protocol)(twi_context->edriver_mm_comm_protocol))(twi_context, flag);
return value ;
}
long _stdcall cpp_eui_gpio_protocol(twi_context_ * twi_context, long flag)
{
((API_eui_mdio_comm_protocol)(twi_context->edriver_eui_gpio_comm_protocol))(twi_context, flag);
return 4;
}
long _stdcall cpp_eui_mdio_protocol(twi_context_ * twi_context, long flag)
{
((API_eui_gpio_comm_protocol)(twi_context->edriver_eui_mdio_comm_protocol))(twi_context, flag);
return 4;
}
long _stdcall cpp_eui_i2c_protocol(twi_context_ * twi_context, long flag)
{
((API_eui_i2c_comm_protocol)(twi_context->edriver_eui_i2c_comm_protocol))(twi_context, flag);
return 4;
}
long _stdcall edriver_mem_api(twi_context_ * twi_context)
{
long flag = cpp_comm_protocol( twi_context, 1);
cpp_eui_i2c_protocol(twi_context,2);
cpp_eui_mdio_protocol(twi_context,3);
cpp_eui_gpio_protocol(twi_context,4);
cin.get();
return 1;
}
然后我在c# 程序里调用
namespace Test_Form
{
public partial class Form1 : Form
{
//[UnmanagedFunctionPointer(System.Runtime.InteropServices.CallingConvention.StdCall)]
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int Func_delegate();
[StructLayout(LayoutKind.Sequential)]
public struct MyData
{
public int callback_en;
public Func_delegate edriver_mm_comm_protocol;
public Func_delegate edriver_eui_mdio_comm_protocol;
public Func_delegate edriver_eui_i2c_comm_protocol;
public Func_delegate edriver_eui_gpio_comm_protocol;
public string edriver_comm_protocol_data;
public string api_message;
}
[DllImport("MyDll.dll", EntryPoint = "edriver_mem_api")]
public static extern int edriver_mem_api(ref MyData my_struct);
public Form1()
{
InitializeComponent();
}
public int edriver_mm_comm_protocol()
{
MessageBox.Show("edriver_mm_comm_protocol is triggered");
return 1;
}
public int edriver_eui_mdio_comm_protocol()
{
MessageBox.Show("edriver_eui_mdio_protocol is triggered");
return 1;
}
public int edriver_eui_i2c_comm_protocol()
{
MessageBox.Show("edriver_eui_i2c_comm_protocol is triggered");
return 1;
}
public int edriver_eui_gpio_comm_protocol()
{
MessageBox.Show("edriver_eui_gpio_comm_protocol is triggered");
return 1;
}
}
}
然后我现在的程序时执行 int value = edriver_mem_api(ref Str_Test);之后程序直接关闭,
根本不会跳到if(value == 1)
{}
我猜测是执行了long flag = cpp_comm_protocol( twi_context, 1);//c++ 里面的
后面的三条没执行,但是这条执行的也不对,它执行时把c#的程序给关掉了。
因为c++的dll已经写好了,我需要测试这种调用方法对不对,
我该怎么办,实在想不出来哪里出了问题。。。
#4
把给你写 C++ DLL 的家伙打一顿。
你的 C# 程序必须按照 C++ 的代码来写。
让提供 C++ DLL 的人用 C++ 写一个调用程序,你会发现应该怎样写。
谢谢回答,我想还是帮我看下代码吧
我现在需要在c# 程序中把从c++ 得到的数据得到。
对于共享临时文本文件,我估计可能用不到。
c++ 的dll
下面是我的c++dll code 在testdll.h 文件中 typedef int ( _stdcall *API)();
typedef struct twi_context_
{
long callback_en;
API edriver_mm_comm_protocol;
API edriver_eui_mdio_comm_protocol;
API edriver_eui_i2c_comm_protocol;
API edriver_eui_gpio_comm_protocol;
char* edriver_comm_protocol_data;
char* api_message;
}twi_context ;
extern "C" {
_declspec(dllexport) long _stdcall edriver_mem_api(twi_context_ * twi_context);
};
在testdl.cpp 文件中 typedef long (_stdcall *API_comm_protocol)(twi_context_ * , long);
typedef long (_stdcall *API_eui_mdio_comm_protocol)(twi_context_ *, long);
typedef long (_stdcall *API_eui_i2c_comm_protocol)(twi_context_ *, long);
typedef long (_stdcall *API_eui_gpio_comm_protocol)(twi_context_ *, long);
long _stdcall cpp_comm_protocol(twi_context_ * twi_context, long flag)
{
long value = ((API_comm_protocol)(twi_context->edriver_mm_comm_protocol))(twi_context, flag);
return value ;
}
long _stdcall cpp_eui_gpio_protocol(twi_context_ * twi_context, long flag)
{
((API_eui_mdio_comm_protocol)(twi_context->edriver_eui_gpio_comm_protocol))(twi_context, flag);
return 4;
}
long _stdcall cpp_eui_mdio_protocol(twi_context_ * twi_context, long flag)
{
((API_eui_gpio_comm_protocol)(twi_context->edriver_eui_mdio_comm_protocol))(twi_context, flag);
return 4;
}
long _stdcall cpp_eui_i2c_protocol(twi_context_ * twi_context, long flag)
{
((API_eui_i2c_comm_protocol)(twi_context->edriver_eui_i2c_comm_protocol))(twi_context, flag);
return 4;
}
long _stdcall edriver_mem_api(twi_context_ * twi_context)
{
long flag = cpp_comm_protocol( twi_context, 1);
cpp_eui_i2c_protocol(twi_context,2);
cpp_eui_mdio_protocol(twi_context,3);
cpp_eui_gpio_protocol(twi_context,4);
cin.get();
return 1;
}
然后我在c# 程序里调用
namespace Test_Form
{
public partial class Form1 : Form
{
//[UnmanagedFunctionPointer(System.Runtime.InteropServices.CallingConvention.StdCall)]
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int Func_delegate();
[StructLayout(LayoutKind.Sequential)]
public struct MyData
{
public int callback_en;
public Func_delegate edriver_mm_comm_protocol;
public Func_delegate edriver_eui_mdio_comm_protocol;
public Func_delegate edriver_eui_i2c_comm_protocol;
public Func_delegate edriver_eui_gpio_comm_protocol;
public string edriver_comm_protocol_data;
public string api_message;
}
[DllImport("MyDll.dll", EntryPoint = "edriver_mem_api")]
public static extern int edriver_mem_api(ref MyData my_struct);
public Form1()
{
InitializeComponent();
}
public int edriver_mm_comm_protocol()
{
MessageBox.Show("edriver_mm_comm_protocol is triggered");
return 1;
}
public int edriver_eui_mdio_comm_protocol()
{
MessageBox.Show("edriver_eui_mdio_protocol is triggered");
return 1;
}
public int edriver_eui_i2c_comm_protocol()
{
MessageBox.Show("edriver_eui_i2c_comm_protocol is triggered");
return 1;
}
public int edriver_eui_gpio_comm_protocol()
{
MessageBox.Show("edriver_eui_gpio_comm_protocol is triggered");
return 1;
}
}
}
然后我现在的程序时执行 int value = edriver_mem_api(ref Str_Test);之后程序直接关闭,
根本不会跳到if(value == 1)
{}
我猜测是执行了long flag = cpp_comm_protocol( twi_context, 1);//c++ 里面的
后面的三条没执行,但是这条执行的也不对,它执行时把c#的程序给关掉了。
因为c++的dll已经写好了,我需要测试这种调用方法对不对,
我该怎么办,实在想不出来哪里出了问题。。。
#4
把给你写 C++ DLL 的家伙打一顿。
你的 C# 程序必须按照 C++ 的代码来写。
让提供 C++ DLL 的人用 C++ 写一个调用程序,你会发现应该怎样写。