网上文摘 小说 Flash游戏 最近更新 下载排行 资源分类 下载指南
经典编程资源 精彩不容错过
设为首页
加入收藏
联系我们
当前位置:Delphi园地技巧文章编程心得 → Delphi如何调用C++写的DLL
Delphi如何调用C++写的DLL
日期:2007年11月20日 作者:小宇飞刀 人气: 查看:[大字体 中字体 小字体]
BOOL  WINAPI funname(char *pFileName,char *pID);
这是C++写的一个DLL里面的函数

我现在想用delphi调用这个函数
静态:
function funname(var pFileName:pchar;var pID:pchar):integer;stdcall;
external 'DLLNAME.dll' name 'funname';

动态:
OneHandle := LoadLibrary(DLLNAME.dll'); //动态载入DLL,并返回其句柄
 try
   if oneHandle<>0 then
     @funname:= GetProcAddress(OneHandle,'funname');
     if not( @funname = nil ) then
     .....
 finally
   FreeLibrary(OneHandle);

现在调试数据不成功
是不是传参问题呢
还是函数在delphi里调用不对
调用应该是成功的
哪位高手帮帮忙
--------------------------------------------------------------------------------
试过了   不行滴说
--------------------------------------------------------------------------------
type
 TFun = function(FileName: PChar; ID: PChar): BOOL; stdcall;

var
 Func: TFunc;
begin
  Handle := LoadLibrary(DLLNAME.dll'); //动态载入DLL,并返回其句柄
  try
   if Handle > 0 then
     Func := GetProcAddress(Handle, 'funname');
     if Assigned(Func) then
       Func('MyFileName', 'MyID');
  finally
    FreeLibrary(Handle);
  end
--------------------------------------------------------------------------------
function funname(pFileName:pchar; pID:pchar):integer; stdcall; external 'DLLNAME.dll' name 'funname';

这样试下,一般char *对应的是PChar,而不是var A: PChar
--------------------------------------------------------------------------------
dll可能不是按照标准顺序调用参数的
--------------------------------------------------------------------------------
先用vc++做个dll,记得声明函数的时候要_stdcall做前缀,例如:
_stdcall int TestC(int i);
_stdcall char* add1(char *s);
然后将此dll放在delphi程序的目录里,在delphi动态引用此dll的某函数的时候,要用cdecl做后缀;例如:
 M:function(i:integer):integer;cdecl;
 M1:function(i:pChar):pChar;cdecl;
--------------------------------------------------------------------------------
function funname(pFileName:pchar; pID:pchar):integer; stdcall; external 'DLLNAME.dll' name 'funname';

也可以这样试试

function funname(pFileName:pchar;var pID:char):integer; stdcall; external 'DLLNAME.dll' name 'funname';
--------------------------------------------------------------------------------
delphi中的char *是pansichar
--------------------------------------------------------------------------------
ansean基本把这个问题说清楚了。
1、保证你传递的参数要正确:C++中的char *对应PASCAL中的pchar。
2:C++中导出的函数的参数调用方式要和你DELPHI中的导入的函数参数调用方式要一致!
 例如:    C++的参数调用方式           对应的DELPHI的参数调用方式
           _declspec                              cdecl
           WINAPI,CALLBACK                        stdcall
           PASCAL                                 pascal
我遇到过你同样的问题,后来把STDCALL改为cdecl,问题就解决了,因为我在C++导出函数时使用的是“_declspec(dllexport)”,也就是C参数调用格式。

(出处:http://xieyunc.blog.163.com/blog/static/1363060120074232135421/)

相关文章:
·用hook实现dll注入详解
·我的数据库及DLLTIPS
·Delphi中高级DLL的编写和调用(1)
·Delphi中高级DLL的编写和调用(2)
·Delphi中高级DLL的编写和调用(3)
·Dll(动态链接库)学习笔记
·从 .exe 或 .dll中提取icon
·取得DLL所在的运行目录
·DELPHI 中动态链接库(DLL)的使用
·写调用动态链接库DLL的应用程序
 → 特别推荐
 → 热点TOP10
关于我们 | 广告服务 | 发布资源 | 联系站长 Copyright © 2002-2006 Delphi园地 All Rights Reserved