C#调用C的dll,const char* 怎么传递?

云海玉弓缘 2018-04-04 10:45:39
C写的DLL,函数名如下:

//函数原型
typedef void(__stdcall *GetNameSTR)(const char* name, int ip);
//我在C里这里这么调用没问题
HMODULE hdll = LoadLibraryA("xx.dll");
if (hdll != NULL)
{
GetNameSTR proc = (GetNameSTR)GetProcAddress(hdll, "GetNameSTR");
if (proc != NULL)
{
char Name[10] = "123456789";
int Ip = 408;
proc(Name, Ip);
printf("\nresult= %s", Name);
}
}


在C#里

[DllImport("xx.dll")]
public static extern void GetNameSTR(ref StringBuilder Name, int IP);
StringBuilder Name = new StringBuilder(10);
GetNameSTR(ref Name, 408);
//失败,没有获取到name。

[DllImport("xx.dll")]
public static extern void GetNameSTR(ref string Name, int IP);
string Name = "123456789";
GetNameSTR(ref Name, 408);
//同样失败,没有获取到name。

另外这个xx.dll的源代码没有了,我用IDA打开反汇编按F5查看这个函数的伪代码大概是这样

signed int __stdcall GetNameSTR(const char *a1, int a2)
{
int v2; // eax
unsigned int v3; // ecx
char *v4; // edx
unsigned int v5; // eax
char *v6; // esi

if ( !byte_1000D004 )
Init();
v2 = a2;
if ( a2 <= dword_1000D008 + dword_1000D00C + dword_1000D014 + dword_1000D010
|| a2 > dword_1000D008 + dword_1000D00C + dword_1000D010 + dword_1000D014 + dword_1000D018 )
{
return 0;
}
v3 = strlen(a1);
v4 = (char *)&unk_1009AC58 + 136 * (v2 - dword_1000D014 - dword_1000D010 - dword_1000D00C - dword_1000D008);
v5 = 0;
if ( v3 )
{
v6 = (char *)a1;
do
{
if ( v5 >= 0x10 )
*v6 = 32;
else
*v6 = v6[v4 - a1];
++v5;
++v6;
}
while ( v5 < v3 );
}
return 1;
}

各位大佬,这个const char* name 在C#里到底要怎么传递啊?

...全文
1093 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
kampoo 2018-04-04
  • 打赏
  • 举报
回复
const char* 表示的传入,不是用来获取值的。传出是用来获取值的,在C++一般是两个参数: char*, int length
云海玉弓缘 2018-04-04
  • 打赏
  • 举报
回复
void GetNameSTR(const char* name, int ip); 这个dll的函数有点特别,它没有返回值,但确实是根据第二个参数ip返回name的值,但是name的类型是const char*,如果表明不可更改的话怎么返回name值呢? 不过目前我偶然间解决了这个问题,瞎试结果试成功了 我用C#是这么调用的:

//声明第一个参数name用[MarshalAs(UnmanagedType.VBByRefStr)]封送,
//UnmanagedType.VBByRefStr的解释是:一个值,该值使 Visual Basic 能够更改非托管代码中的字符串,并使结果在托管代码中反映出来。
[DllImport("xx.dll")]
public static extern void GetNameSTR([MarshalAs(UnmanagedType.VBByRefStr)]ref string Name, int IP);
//调用
int Ip = 400;
string Name = "1234567890";
GetNameSTR(ref Name, Ip);
//Name里获取的值为:"测试@Test\0"  中文符号英文都正常,但是这个c写的dll里好像把传入的10个字符后面不足的都用\0补齐了。
xian_wwq 2018-04-04
  • 打赏
  • 举报
回复
const char* 表明参数不可更改,仅仅传入 所以使用string就可以

110,567

社区成员

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

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

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