DELPHI 调用C++ DLL出错(100分)

  • 主题发起人 主题发起人 小小东
  • 开始时间 开始时间

小小东

Unregistered / Unconfirmed
GUEST, unregistred user!
我在DELPHI中调用C++的DLL时,如果参数中含有指针变量,运行时会提示内存出错
如C++的函数原形如下:
C++:
extern "C" __declspec(dllimport ) __stdcall long ReadRam2k(long AR_ID,char *DataBuff,long BlockFlag);
功能:读128条数据
参数:
AR_ID 外部设备编号
DataBuff 数据从此参数返回.
BlockFlag 块标志.
返回:1 数据未完并请求下一块. 0数据完成.
该函数是在一个外部设备中读取数据,因为该DLL是第三厂商提供,所以没办法看到源程序[:(][:(]
代码:
我在DELPHI中调用如下:
DELPHI
implementation
FUNCTION ReadRam2k(AR_ID:DWORD;DataBuff:PChar;BlockFlag:DWORD):DWORD;
STDCALL;
external 'DLL文件名';
{$R *.DFM}
procedure TForm1.Button2Click(Sender: TObject);
VAR S2:PChar;
S1:STRING;
begin
ReadRam2k(1,S2,0);
S1:=S2;
MEMO1.Lines.Clear;
MEMO1.Lines.Add(S1);
end;
当单击按纽2时,数据能从外设返回,但数据返回的同时系统提示内存出错,望各位大虾指教
 
在VC++编译所生成的DEF文件当中EXPORTS中指定导出函数的名称.
 
感谢liguang的回复,但该DLL不是我编写的,而且只有单独的一个DLL文件,没办法对其进行修改
 
是否要先对s1先申请空间?
如GetMem(s1,128)
不像是该函数会自己申请空间。
 
先用TDump看一下函数的名称,然后在你静态加载DLL的函数声明中加入name '';如
FUNCTION ReadRam2k(AR_ID:DWORD;DataBuff:PChar;BlockFlag:DWORD):DWORD;
STDCALL;
external 'DLL文件名' name '';
我以前调用板卡提供的DLL一直是这样做的,还有98系统下正确的,在2k下则常常会
出现内存错误的提示。
 
Function Test_founction():integer;cdecl ;external 'test_dll.dll';
这是由于 参数压栈顺序不同, cdecl 对应 extern "C"
如果用WINPAI 输出 就要用 stdcall 了
 
1. VC DLL为扩展DLL。delphi只能用cdecl方式调用。如果DLL声明为stdcall,delphi中用cdecl和
    stdcall都会出错。
2. VC DLL为常规DLL。DLL中只能导出C样式的函数,不能导出C++类,成员函数或重载函数。如果用到
了MFC就要在每个导出函数中都使用:
   AFX_MANAGE_STATE(AfxGetstatic ModuleStute());
 
接受答案了
 
后退
顶部