Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 5446|回复: 13

不知道怎么用Lazarus加载C++写的dll动态库

[复制链接]

该用户从未签到

发表于 2014-10-22 22:50:26 | 显示全部楼层 |阅读模式
我有个C++写的动态库文件,我想用Lazarus连接调用dll文件中的函数,不知道用什么连接加载这个dll,请大家帮帮忙.
回复

使用道具 举报

该用户从未签到

发表于 2014-10-24 19:02:58 | 显示全部楼层
function xxxxx(const str: PChar): integer; cdecl; external 'xxx.dll';
一般类似这样
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2014-10-25 22:55:47 | 显示全部楼层
樓主方便把dll的名稱與函式的原型說出來嗎?
回复 支持 反对

使用道具 举报

  • TA的每日心情

    2021-8-18 08:54
  • 签到天数: 1421 天

    [LV.10]以坛为家III

    发表于 2014-10-26 13:45:54 | 显示全部楼层
    我是这样做的:
    首先我使用VS2008建立了一个32位项目的DLL文件,其CPP中内容如下:
    #include "stdafx.h"

    _declspec(dllexport) int mcd(int a,int b)
    {
            if(b==0)
                    return a;
            return mcd(b ,a % b);
    }

    编译后生成McdDLL.dll文件。

    然后我在Lazarus中使用这种方式调用:
    function mcd(a,b:Integer):Integer;cdecl;external 'McdDLL' index 1;  

    先前我使用:function mcd(a,b:Integer):Integer;external 'McdDLL' index 1;
    没有加上cdel关键字,程序可以运行但是返回的结果不对,我的程序例子是计算2个数的最大公约数。
    后来我尝试使用 function mcd(a,b:Integer):Integer;cdecl;external 'McdDLL.dll' ;没有加上index 1,此时运行后,会出现无法定位dll文件入口的讯息。

    只有修改成function mcd(a,b:Integer):Integer;cdecl;external 'McdDLL' index 1;  后程序才能使用并且不会报错,且结果也是正确的。

    这是程序运行结果。


    这是程序界面以及代码:

    最后,在下图中蓝色标志的部分为VS2008编写DLL文件后生成的文件,其余为Lazarus生成的文件。


    Good Luck~



    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册(注册审核可向QQ群索取)

    x
    回复 支持 反对

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2014-10-26 22:02:41 | 显示全部楼层
    cvlsam 发表于 2014-10-26 13:45
    我是这样做的:
    首先我使用VS2008建立了一个32位项目的DLL文件,其CPP中内容如下:
    #include "stdafx.h"
    ...

    谢谢啊,我是个新手.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2014-10-28 09:30:01 | 显示全部楼层
    cvlsam 发表于 2014-10-26 13:45
    我是这样做的:
    首先我使用VS2008建立了一个32位项目的DLL文件,其CPP中内容如下:
    #include "stdafx.h"
    ...

    我现在用易语言写了个dll,勾了公开,用Lazarus无法调用,显示unit1.pas(126,12) Fatal: Syntax error, ";" expected but "identifier PIPE" found,这个Pipe就是dll名称和函数名称,但这个函数是个void函数,用易语言却能调用,我不知道是怎

    么回事,能帮我看看吗,这是代码

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册(注册审核可向QQ群索取)

    x
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2021-8-18 08:54
  • 签到天数: 1421 天

    [LV.10]以坛为家III

    发表于 2014-10-28 19:59:03 | 显示全部楼层
    苍云 发表于 2014-10-28 09:30
    我现在用易语言写了个dll,勾了公开,用Lazarus无法调用,显示unit1.pas(126,12) Fatal: Syntax error, ";"  ...

    我也是Lazarus的菜鸟,看了您的代码,看到您这样调用:
        function Pipe();cdecl;external 'Pipe' index 1;
    我的想法是,您可以在implementation部分写入:
         procedure Pipe();cdecl;external 'Pipe' index 1;

    试试看。

    Good Luck~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2014-10-28 23:28:04 | 显示全部楼层
    我是这样写的:
    1.   {$IfDef Windows}
    2.      Function DogRead(DBytes:longWord; DAddr:LongWord; DData:pointer): LongWord; StdCall; external 'win32dll.dll';
    3.      Function DogWrite(DBytes:longWord; DAddr:LongWord; DData:pointer): LongWord; StdCall; external 'win32dll.dll';
    4.   {$ELSE}
    5.      Function MyReadDog(Address:word; Bytes:word; pData:pointer):longword; cdecl;external'libdllinuxk.so';
    6.      Function MyWriteDog(Address:word; Bytes:word; pData:pointer):longword; cdecl;external'libdllinuxk.so';
    7.   {$ENDIF}   
    复制代码
    回复 支持 反对

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2014-10-29 09:21:07 | 显示全部楼层
    cvlsam 发表于 2014-10-28 19:59
    我也是Lazarus的菜鸟,看了您的代码,看到您这样调用:
        function Pipe();cdecl;external 'Pipe' ind ...

    可以编译成功,但是运行时却不能运行,并弹出编译器崩溃,让人感到郁闷啊.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2014-10-29 09:23:01 | 显示全部楼层
    bugxiong 发表于 2014-10-28 23:28
    我是这样写的:

    这样写不能编译不能通过,procedure Pipe();cdecl;external 'Pipe' index 1;这样写到时可以,就是运行时会出现无法运行并弹出编译器崩溃.....确实很奇怪
    回复 支持 反对

    使用道具 举报

    *滑块验证:

    本版积分规则

    QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

    GMT+8, 2025-5-2 13:28 , Processed in 0.054765 second(s), 9 queries , Redis On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表