C#调用c++封装的dll 无返回 10
1、我有一个C++的dll,c++dll中导出的函数名为fnc_3des_decrypt_data@@YAPAEPAE@Z,是一个解密的函数,我在用vs2010创建c++...
1、我有一个C++的dll,c++ dll中导出的函数名为fnc_3des_decrypt_data@@YAPAEPAE@Z,是一个解密的函数,我在用vs2010创建c++控制台程序测试,另外自己写了一个函数dm_decode调用c++ dll的fnc_3des_decrypt_data@@YAPAEPAE@Z,是没问题的,可以正常解密;2、因为fnc_3des_decrypt_data@@YAPAEPAE@Z 是提供方提供的dll里面的函数,提供方没设置好,编译后的dll导出函数名乱七八糙的,我就自己创建了一个c++的dll (DecodeDemo.dll)重新封装了fnc_3des_decrypt_data@@YAPAEPAE@函数 (其实就是1中说到的dm_decode函数,只不过在这里封装成了dll),新的dll导出的函数名dm_decode。dm_decode 函数的原型:extern "C" unsigned char* __stdcall dm_decode(unsigned char* enc_dat);3. 在c#的控制台程序中引入dll [DllImport("DecodeDemo.dll",CharSet = CharSet.Ansi, SetLastError = true)] public unsafe static extern string dm_decode(string enc_data);然后在program.cs文件中调用函数 string decdata = dm_decode("8E313E99CBA24DC528EF42253F3A09F3");但是变量decdata收到的却是null,真是想不通,明明我在第1步c++的控制台程序中测试dm_decode函数的时候是没问题的,正常返回,但是在c#调用就出出问题。拜求c++、c#的大神帮忙解惑,好人一生平安
展开
2个回答
展开全部
运行库组件
你可以在腾讯电脑管家的电脑诊断中找到软件问题,选择丢失VC++组件,点击立即修复。
或
在工具箱,打开电脑诊所,丢失.Dll 文件,进行一键修复
你可以在腾讯电脑管家的电脑诊断中找到软件问题,选择丢失VC++组件,点击立即修复。
或
在工具箱,打开电脑诊所,丢失.Dll 文件,进行一键修复
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
C++ 代码里在数组最后加一个不可能的数字比如-1,之后在C# 里面读出来:
C++ 代码:
char *A(char buf[])
{
char buffer[50]={};
int i = 0;
while(buf[i] != '/0' && i < 49) {
buffer[i] = buf[i]
i++;
}
buffer[i] = -1;
return buffer;
}
/////////////////////////////
C# 代码:
unsafe{
char* buffer = A(buf);
int i = 0;
while(buffer[i++] != -1) {
Console.out.writeln(buffer[i]);
}
}
或者可以在DLL 里面再写一个函数int getSize() 返回数组的长度:
C++代码:
static int size = 0;
int getSize(){
return size;
}
char *A(char buf[])
{
char buffer[50]={};
while(buf[i] != '/0' && i < 49) {
buffer[i] = buf[i]
size++;
}
return buffer;
}
C#代码:
C# 代码:
unsafe{
char* buffer = A(buf);
int size = getSize();
for(int i = 0; i < size; i++) {
Console.out.writeln(buffer[i]);
}
}
C++ 代码:
char *A(char buf[])
{
char buffer[50]={};
int i = 0;
while(buf[i] != '/0' && i < 49) {
buffer[i] = buf[i]
i++;
}
buffer[i] = -1;
return buffer;
}
/////////////////////////////
C# 代码:
unsafe{
char* buffer = A(buf);
int i = 0;
while(buffer[i++] != -1) {
Console.out.writeln(buffer[i]);
}
}
或者可以在DLL 里面再写一个函数int getSize() 返回数组的长度:
C++代码:
static int size = 0;
int getSize(){
return size;
}
char *A(char buf[])
{
char buffer[50]={};
while(buf[i] != '/0' && i < 49) {
buffer[i] = buf[i]
size++;
}
return buffer;
}
C#代码:
C# 代码:
unsafe{
char* buffer = A(buf);
int size = getSize();
for(int i = 0; i < size; i++) {
Console.out.writeln(buffer[i]);
}
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询