有关vc调用delphi dll pchar乱码 问题,高分求解

时间:2022-07-27 05:50:00
delphi的一个dll里面函数:

Function fnbReadEnregister(RecCount:integer;var OutData:Pchar):Integer;stdcall; external 'PkeyDll.dll';


vc调用的代码:

                char rs[50]; 
LPVOID * temp;
int ors = -1000;
HMODULE m_hDll = NULL;
typedef  int (__stdcall  *function)(int ,char *);
function RetF;
m_hDll = LoadLibrary("PKeyDLL.dll");
if(m_hDll != NULL)
{
RetF=(function)GetProcAddress(m_hDll,"fnbReadEnregister");
                ors = RetF(2,(char *)rs); // 这里rs取到值后是乱码,就是这个问题

}
else
{
strcpy(rs,"<Exception>cant load PKeyDLL.dll</Exception>");
}
FreeLibrary(m_hDll);
return env->NewStringUTF(rs);

4 个解决方案

#1


高手们都到哪里去了啊

#2


把delphi的一个dll里面函数改成这样试试:

Function fnbReadEnregister(RecCount:integer;OutData:Pchar):Integer;stdcall; external 'PkeyDll.dll';

#3


OutData:Pchar
与char 的类型是否一样。 

你可以看一下OutData:Pchar在内存中的存放格式。 比如 一个串“abcd" 在内存中是 a0b0c0d0那么就把typedef  int (__stdcall  *function)(int ,wchar_t *);

并且最好计算一下RecCount:integer类型的长度。就是C中的SIZEOF(RecCount:integer)的意思要保护第一个参数所站用的内存大小与RecCount:integer相同

#4


char rs[50]; 改
 char *rs=(char*)malloc(50);
 strcpy(rs,"abcde");

  ors = RetF(2,rs); // 这样在试一下。

#1


高手们都到哪里去了啊

#2


把delphi的一个dll里面函数改成这样试试:

Function fnbReadEnregister(RecCount:integer;OutData:Pchar):Integer;stdcall; external 'PkeyDll.dll';

#3


OutData:Pchar
与char 的类型是否一样。 

你可以看一下OutData:Pchar在内存中的存放格式。 比如 一个串“abcd" 在内存中是 a0b0c0d0那么就把typedef  int (__stdcall  *function)(int ,wchar_t *);

并且最好计算一下RecCount:integer类型的长度。就是C中的SIZEOF(RecCount:integer)的意思要保护第一个参数所站用的内存大小与RecCount:integer相同

#4


char rs[50]; 改
 char *rs=(char*)malloc(50);
 strcpy(rs,"abcde");

  ors = RetF(2,rs); // 这样在试一下。