开发过程是这样的
首先用pro/c++编写pc文件,然后通过pro/c转换为cpp文件
然后再将cpp在vc环境下面编译成dll
最后在c#下面调用这个dll
可是调用的时候出现问题了
VC的函数是用CHAR *作为参数写的
例如
extern "C" __declspec(dllexport) int con_t_ora(char *Ldb_name,char *Lusername,char *Lpassword,char *remsg,char *errormsg)
{ ............. MessageBox(NULL,Ldb_name,"sss",MB_OK);
return 1;
}
而C#下面一般不提倡用指针的
我就使用了string作为传递参数
问题出现了
VC的DLL函数仅仅能接受第一个字符
也就是说
在C#下面调用并不是按照VC的方式调用的
C#下面取得首地址,并没有继续寻找地址
所以按照CHAR来处理的,而不是按照CHAR *处理的不知道如何解决这个问题
经过试验,如果两边都声明为INT类型,是可以相互传递的请高手赐教
首先用pro/c++编写pc文件,然后通过pro/c转换为cpp文件
然后再将cpp在vc环境下面编译成dll
最后在c#下面调用这个dll
可是调用的时候出现问题了
VC的函数是用CHAR *作为参数写的
例如
extern "C" __declspec(dllexport) int con_t_ora(char *Ldb_name,char *Lusername,char *Lpassword,char *remsg,char *errormsg)
{ ............. MessageBox(NULL,Ldb_name,"sss",MB_OK);
return 1;
}
而C#下面一般不提倡用指针的
我就使用了string作为传递参数
问题出现了
VC的DLL函数仅仅能接受第一个字符
也就是说
在C#下面调用并不是按照VC的方式调用的
C#下面取得首地址,并没有继续寻找地址
所以按照CHAR来处理的,而不是按照CHAR *处理的不知道如何解决这个问题
经过试验,如果两边都声明为INT类型,是可以相互传递的请高手赐教
我不是很清楚在.net框架下
是怎么调用DLL的
能否有高手指点一下我也好知道如何解决
找其他的方案
public static extern string Discovery(int p_intDelayTime);VC中是char * Discovery(int p_intDelayTime);你的代码
con_t_ora(char *Ldb_name,char *Lusername,char *Lpassword,char *remsg,char *errormsg)
可以改为
con_t_ora(string Ldb_name,string Lusername,string Lpassword,string remsg,string errormsg)
extern "C" NATIVEDLL_API void StringTest(char* str)
{
cout << str << endl;
}C#
[DllImport(testDllPath)]
static extern void StringTest(string str);
...
StringTest("已测试。");// 肯定是对的
是什么意思?
#define NATIVEDLL_API __declspec(dllexport)
#else
#define NATIVEDLL_API __declspec(dllimport)
#endif
static extern int con_t_ora(
StringBuilder name,
StringBuilder username,
StringBuilder password,
StringBuilder remsg,
StringBuilder errormsg)用的时候
StringBuilder name = new StringBuilder(255);
……其他省略int result = con_t_ora(name ,username,password,remsg,errormsg);
尤其是Sunmast
但是问题并不是你们描述的
现在我已经解决
由于在C#中无论是STRING还是STRINGBUILDER或者CHAR[]都是16位的
而在VC中CHAR *是8位的
所以我现在在C#下面是使用BYTE[]就可以正确的传输了这样也可以解释为什么
传送回来的字符串
会出现乱码了该问题已经完结
谢谢楼上的同志