我在delphi里面调用vc写的动态连接库,每次调用完都会出现内存违规操作。怎么回事???
解决方案 »
- 用DELLPHI 郵件的問題
- EHLib 安装时说少了个文件?
- "仓库入库单类型"程序实现方法(主从表),讨论!求解!
- 如何知道鼠标指针是否移到窗口的最顶部或最底部??
- 想写个程序,让它开机后一直在后台运行,程序本身用来接受一些命令就行,有没有什么方法让程序占资源少点!
- 各位高手啊!求助有关在Table Query组件的问题啊
- COM技术的应用方面与存在形式?
- 多表查询的问题
- 關于數據庫批量操作與progressbar的結合使用問題
- 我接了一宗私活,快做完了,事先没有合同,突然担心客户不给钱,我如何对程序进行加密,先让他试用一段时间,超过时间不给,就把程序删掉,交钱后就能正常运行|?
- 求DsgnIntf.dcu
- .如何做出像东方快车,金山快译那样没有标题栏,没有最大,最小,关闭按钮,却可以随意移动,谢谢。
1、将多Dll文件拷到Systems下;
2、在Implementation后调用就可以了例如:
Function CAN_Open():Integer;stdcall;external 'Win32can.dll' ;
3 、Delphi 支持五种调用模式:register、cdecl、pascal、stdcall和safecall。根据调用模式的不同,参数可以通过CPU的寄存器或堆栈传递给函数和过程。register模式使用CPU的三个寄存器传递参数,而其它模式则用堆栈来传递参数。在register和pascal模式下从左至右传递参数,即参数表中最左边的参数最先被求值并传递,而最右边的参数最后求值并传递。另三种模式cdecl、stdcall和safecall则从右至左传递参数。这些模式中除了cdecl外,都是由过程和函数在返回时清除堆栈中的参数,而对于cdecl模式,需由调用者在调用结束时清除堆栈中的参数。
如何选择调用模式,有以下三条规则:
1.Delphi 3.0使用register模式作为缺省调用模式以提高运行效率。
2.如果有调用关系的几个模块是用不同语言编写的,其接口应使用stdcall模式。
3.如果要实现双界面函数和过程,应使用safecall模式。
所以解决我们的问题只要选用stdcall模式即可,Schlumberger公司的《编程指南》上在Microsoft C环境下的DLL函数说明(仅举两例)为:
void(FAR PASCAL *Imp_ Connect)(unsigned short far*,short far*);
void(FAR PASCAL *Imp_ Init)(short far*,short far*);
相应的在Delphi 3.0下DLL函数引入说明为:
procedure Imp_ Connect(var CardAddress:word;var CardHandle:smallint);stdcall;
procedure Imp_ Init(var Poll_Tab:smallint;var ErrorFlag:smallint;var CardHandle:smallint);stdcall;
extern "C" __declspec( dllexport ) void IniFile(Datalist* result,LPCSTR filename);delphi
type myfun = procedure( list : pDatalist; filename : PChar);stdcall;
var
casefun:myfun;
begin
Handle := Loadlibrary('d:\\libcase.dll');
if myHandle<>0 then
begin
getmem(caselist,sizeof(datalist));
@casefun := GetProcAddress(myHandle, 'IniFile');
if @casefun<>nil then
begin
casefun(caselist, 'd:\\00200049.str');
end;
end;
FreeLibrary(myHandle);datalist为结构
你VC中没有指定__stdcall。默认是cdecl,参数压栈顺序不一样啊。
try
@casefun := GetProcAddress(myHandle, 'IniFile');
if @casefun<>nil then
begin
casefun(caselist, 'd:\\00200049.str');
end;
finally
FreeMem(CaseList);
end;
界面下面用button触发调用才会出错。
但是出栈的处理不一样,一个是由调用者处理,一个是由被调用者处理