程序需要C#调用C++的API,
C++代码如下:
typedef struct tagGlobalInitParams
{
char* DBServer;
char* DBName;
char* DBUser;
char* DBPassword;
char* LoginUser;
char* LoginCompId;
char* AppType;
wchar_t* AppDesc;
int RunStyle;
}
TGlobalInitParam;
TGlobalInitParam GlobalParam;
extern "C" __declspec(dllexport) WINAPI bool InitGlobalEnviroment(TGlobalInitParam* GPin)
{
AnsiString dbserver = GPin->DBServer;
AnsiString dbname = GPin->DBName;
AnsiString dbuser = GPin->DBUser;
AnsiString dbpassword = GPin->DBPassword;
AnsiString compid = GPin->LoginCompId;
AnsiString userid = GPin->LoginUser;
AnsiString apptype = GPin->AppType;
UnicodeString appdesc = GPin->AppDesc;
int runstyle = GPin->RunStyle; GlobalParam.DBServer = new char[dbserver.Length()];
strcpy(GlobalParam.DBServer, dbserver.c_str()); GlobalParam.DBName = new char[dbname.Length()];
strcpy(GlobalParam.DBName, dbname.c_str()); GlobalParam.DBUser = new char[dbuser.Length()]; //vs2010在这句抛异常
strcpy(GlobalParam.DBUser, dbuser.c_str()); GlobalParam.DBPassword = new char[dbpassword.Length()];
strcpy(GlobalParam.DBPassword, dbpassword.c_str()); GlobalParam.LoginUser = new char[userid.Length()];
strcpy(GlobalParam.LoginUser, userid.c_str()); GlobalParam.LoginCompId = new char[compid.Length()];
strcpy(GlobalParam.LoginCompId, compid.c_str()); GlobalParam.AppType = new char[apptype.Length()];
strcpy(GlobalParam.AppType, apptype.c_str()); GlobalParam.AppDesc = new wchar_t[appdesc.Length()];
wcscpy(GlobalParam.AppDesc, appdesc.c_str()); GlobalParam.RunStyle = runstyle;
return true;
}C#代码如下: public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button4_Click(object sender, EventArgs e)
{
DllInvoke _DllInvoke = new DllInvoke(C++的dll全路径名);
InitEnviromentDelegate InitDelegate = (InitEnviromentDelegate)_DllInvoke.Invoke("InitGlobalEnviroment", typeof(InitEnviromentDelegate)); GlobalInitParams t = new GlobalInitParams();
t.DBServer = "walle";
t.DBPassword = "sa";
t.DBUser = "sa";
t.DBName = "AERP2014";
t.LoginCompId = "A01";
t.LoginUser = "admin";
t.AppDesc = "ES";
t.AppType = "ES";
t.RunStyle = 0;
if (!InitDelegate(ref t))
{
}
}
}
/// <summary>
/// CB初始化
/// </summary>
/// <param name="sb"></param>
/// <returns></returns>
public delegate bool InitEnviromentDelegate(ref GlobalInitParams GPin);
/// <summary>
/// 动态调用Dll
/// </summary>
public class DllInvoke
{
[DllImport("kernel32.dll")]
private extern static IntPtr LoadLibrary(string path);
[DllImport("kernel32.dll")]
private extern static IntPtr GetProcAddress(IntPtr lib, string funcName);
[DllImport("kernel32.dll")]
private extern static bool FreeLibrary(IntPtr lib); private IntPtr hLib;
/// <summary>
///
/// </summary>
/// <param name="DLLPath"></param>
public DllInvoke(String DLLPath)
{
hLib = LoadLibrary(DLLPath);
}
~DllInvoke()
{
FreeLibrary(hLib);
}
/// <summary>
/// 将要执行的函数转换为委托
/// </summary>
/// <param name="APIName"></param>
/// <param name="t"></param>
/// <returns></returns>
public Delegate Invoke(string APIName, Type t)
{
IntPtr api = GetProcAddress(hLib, APIName);
return (Delegate)Marshal.GetDelegateForFunctionPointer(api, t);
}
}
/// <summary>
/// CB初始化参数
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct GlobalInitParams
{
/// <summary>
/// 私服器
/// </summary>
[MarshalAs(UnmanagedType.LPStr)]
public String DBServer;
/// <summary>
/// 资料库
/// </summary>
[MarshalAs(UnmanagedType.LPStr)]
public String DBName;
/// <summary>
/// 用户
/// </summary>
[MarshalAs(UnmanagedType.LPStr)]
public String DBUser;
/// <summary>
/// 密码
/// </summary>
[MarshalAs(UnmanagedType.LPStr)]
public String DBPassword;
/// <summary>
/// 登录用户
/// </summary>
[MarshalAs(UnmanagedType.LPStr)]
public String LoginUser;
/// <summary>
/// 登录公司
/// </summary>
[MarshalAs(UnmanagedType.LPStr)]
public String LoginCompId;
/// <summary>
/// Portal
/// </summary>
[MarshalAs(UnmanagedType.LPStr)]
public String AppType;
/// <summary>
/// Portal描述
/// </summary>
[MarshalAs(UnmanagedType.LPWStr)]
public String AppDesc;
/// <summary>
/// DEMO版限制笔数
/// </summary>
public int RunStyle;
}
C++代码如下:
typedef struct tagGlobalInitParams
{
char* DBServer;
char* DBName;
char* DBUser;
char* DBPassword;
char* LoginUser;
char* LoginCompId;
char* AppType;
wchar_t* AppDesc;
int RunStyle;
}
TGlobalInitParam;
TGlobalInitParam GlobalParam;
extern "C" __declspec(dllexport) WINAPI bool InitGlobalEnviroment(TGlobalInitParam* GPin)
{
AnsiString dbserver = GPin->DBServer;
AnsiString dbname = GPin->DBName;
AnsiString dbuser = GPin->DBUser;
AnsiString dbpassword = GPin->DBPassword;
AnsiString compid = GPin->LoginCompId;
AnsiString userid = GPin->LoginUser;
AnsiString apptype = GPin->AppType;
UnicodeString appdesc = GPin->AppDesc;
int runstyle = GPin->RunStyle; GlobalParam.DBServer = new char[dbserver.Length()];
strcpy(GlobalParam.DBServer, dbserver.c_str()); GlobalParam.DBName = new char[dbname.Length()];
strcpy(GlobalParam.DBName, dbname.c_str()); GlobalParam.DBUser = new char[dbuser.Length()]; //vs2010在这句抛异常
strcpy(GlobalParam.DBUser, dbuser.c_str()); GlobalParam.DBPassword = new char[dbpassword.Length()];
strcpy(GlobalParam.DBPassword, dbpassword.c_str()); GlobalParam.LoginUser = new char[userid.Length()];
strcpy(GlobalParam.LoginUser, userid.c_str()); GlobalParam.LoginCompId = new char[compid.Length()];
strcpy(GlobalParam.LoginCompId, compid.c_str()); GlobalParam.AppType = new char[apptype.Length()];
strcpy(GlobalParam.AppType, apptype.c_str()); GlobalParam.AppDesc = new wchar_t[appdesc.Length()];
wcscpy(GlobalParam.AppDesc, appdesc.c_str()); GlobalParam.RunStyle = runstyle;
return true;
}C#代码如下: public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button4_Click(object sender, EventArgs e)
{
DllInvoke _DllInvoke = new DllInvoke(C++的dll全路径名);
InitEnviromentDelegate InitDelegate = (InitEnviromentDelegate)_DllInvoke.Invoke("InitGlobalEnviroment", typeof(InitEnviromentDelegate)); GlobalInitParams t = new GlobalInitParams();
t.DBServer = "walle";
t.DBPassword = "sa";
t.DBUser = "sa";
t.DBName = "AERP2014";
t.LoginCompId = "A01";
t.LoginUser = "admin";
t.AppDesc = "ES";
t.AppType = "ES";
t.RunStyle = 0;
if (!InitDelegate(ref t))
{
}
}
}
/// <summary>
/// CB初始化
/// </summary>
/// <param name="sb"></param>
/// <returns></returns>
public delegate bool InitEnviromentDelegate(ref GlobalInitParams GPin);
/// <summary>
/// 动态调用Dll
/// </summary>
public class DllInvoke
{
[DllImport("kernel32.dll")]
private extern static IntPtr LoadLibrary(string path);
[DllImport("kernel32.dll")]
private extern static IntPtr GetProcAddress(IntPtr lib, string funcName);
[DllImport("kernel32.dll")]
private extern static bool FreeLibrary(IntPtr lib); private IntPtr hLib;
/// <summary>
///
/// </summary>
/// <param name="DLLPath"></param>
public DllInvoke(String DLLPath)
{
hLib = LoadLibrary(DLLPath);
}
~DllInvoke()
{
FreeLibrary(hLib);
}
/// <summary>
/// 将要执行的函数转换为委托
/// </summary>
/// <param name="APIName"></param>
/// <param name="t"></param>
/// <returns></returns>
public Delegate Invoke(string APIName, Type t)
{
IntPtr api = GetProcAddress(hLib, APIName);
return (Delegate)Marshal.GetDelegateForFunctionPointer(api, t);
}
}
/// <summary>
/// CB初始化参数
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct GlobalInitParams
{
/// <summary>
/// 私服器
/// </summary>
[MarshalAs(UnmanagedType.LPStr)]
public String DBServer;
/// <summary>
/// 资料库
/// </summary>
[MarshalAs(UnmanagedType.LPStr)]
public String DBName;
/// <summary>
/// 用户
/// </summary>
[MarshalAs(UnmanagedType.LPStr)]
public String DBUser;
/// <summary>
/// 密码
/// </summary>
[MarshalAs(UnmanagedType.LPStr)]
public String DBPassword;
/// <summary>
/// 登录用户
/// </summary>
[MarshalAs(UnmanagedType.LPStr)]
public String LoginUser;
/// <summary>
/// 登录公司
/// </summary>
[MarshalAs(UnmanagedType.LPStr)]
public String LoginCompId;
/// <summary>
/// Portal
/// </summary>
[MarshalAs(UnmanagedType.LPStr)]
public String AppType;
/// <summary>
/// Portal描述
/// </summary>
[MarshalAs(UnmanagedType.LPWStr)]
public String AppDesc;
/// <summary>
/// DEMO版限制笔数
/// </summary>
public int RunStyle;
}
GlobalParam.DBUser = new char[dbuser.Length()]; //vs2010在这句抛异常
strcpy(GlobalParam.DBUser, dbuser.c_str());
抛异常:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
用vs2005编译执行就是OK的
vs2010,vs2005都是默认编译环境
代码全在上面呀,高手帮忙看看!!!!!!