python调用Delphi写的Dll代码示例
作者:garfieldtom 发布时间:2023-07-25 09:33:53
标签:delphi,python,dll
首先看下Delphi单元文件基本结构:
unit Unit1; //单元文件名
interface //这是接口关键字,用它来标识文件所调用的单元文件
uses //程序用到的公共单元
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type //这里定义了程序所用的组件,一些类,以及组件所对应的过程、事件
TForm1 = class(TForm)
private //定义私有变量和私有过程
{ Private declarations }
public //定义公共变量和公共过程
{ Public declarations }
end;
var //定义程序使用的公共变量
Form1: TForm1;
implementation //程序代码实现部分
{$R *.dfm}
end.
Delphi单元如下(输出hello.dll):
unit hellofun;
interface
function getint():integer;stdcall;
function sayhello(var sname:PAnsiChar):PAnsiChar;stdcall;
implementation
function getint():integer;stdcall;
begin
result:=888;
end;
function sayhello(var sname:PAnsiChar):PAnsiChar;stdcall;
begin
sname:='ok!';
result:='hello,garfield !';
end;
end.
library hello;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
System.SysUtils,
System.Classes,
hellofun in 'hellofun.pas';
{$R *.res}
exports
getint,
sayhello;
begin
end.
python中调用如下:
import ctypes
def main():
dll=ctypes.windll.LoadLibrary("hello.dll")
ri=dll.getint()
print(ri)
s=ctypes.c_char_p()
rs=ctypes.c_char_p()
rs=dll.sayhello(ctypes.byref(s))
print(s)
print(ctypes.c_char_p(rs))
if __name__ == '__main__':
main()
运行Python,输出如下:
>>>
888
c_char_p(b'ok!')
c_char_p(b'hello,garfield !')
>>>
好了,我们可以让python完成部分功能在Delphi中调用,也可以用Delphi完成部分功能在Python中调用。
以上程序在DelphiXE2及Python3.2中调试通过。
来源:http://www.cnblogs.com/GarfieldTom/archive/2013/03/15/2961994.html


猜你喜欢
- pandas: shape()获取Dataframe的行数和列数返回列数:df.shape[1]返回行数:df.shape[0]  
- nonzero函数返回非零元素的目录。返回值为元组, 两个值分别为两个维度, 包含了相应维度上非零元素的目录值。 import
- 概述map是基于key-value键值对的无序的集合Go语言中的map是引用类型必须初始化才能使用。语法声明和初始化配合make使用,否则是
- 最近忙成了狗,五六个项目堆在一起,头疼的是测试还失惊无神的给我丢来一个几十甚至上百M的日志文件,动不动就几十上百万行,就算是搜索也看得头昏眼
- 一、APC缓存简介APC,全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存”。它为我们提供了缓存和优化PHP的中
- 工作中遇到了要计算两个数百分比的问题,python 2.7 环境。代码:#!/usr/bin/env python#function: 计算
- 相关介绍Python是一种跨平台的计算机程序设计语言。是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动
- sequence 序列sequence(序列)是一组有顺序的元素的集合(严格的说,是对象的集合,但鉴于我们还没有引入“对象”概念,暂时说元素
- 1、查看死锁1)用dba用户执行以下语句select username,lockwait,status,machine,program fr
- 在查询语句中使用 NOLOCK 和 READPAST 处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAS
- 目录1.程序结构2.选择语句2.1最简单的if语句2.2.if …… else 语句2.3.if…elif…else语句2.4 if 语句的
- 这篇文章主要介绍了python实现windows桌面截图代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 概要:Oracle关系数据库系统以其卓越的性能获得了广泛的应用,而保证数据库的安全性是数据库管理工作的重要内容。本文是笔者在总结Oracle
- 今天在帮前端准备数据的时候,需要把数据格式转成json格式,说实话,涉及到中文有时候真的是很蛋疼,除非对Python的编码规则比较了解,不然
- 1. 警告不是异常你是不是经常在使用一些系统库或者第三方模块的时候,会出现一些既不是异常也不是错误的警告信息?这些警告信息,有时候非常多,对
- 场景:集团中心下发本省数据时,并未按地市、业务拆分,现需要按地市、业务拆分并分发到地市。本文利用Python的pandas包实现了以上场景。
- 前言最近需要读取Excel中的内容,然后进行后续操作,对于这块知识,博主以前以为自己不会涉及到,但是现在一涉及到,第一步就错了,搞了好久。真
- Scrapy中Spider的用法Spider类定义了如何爬取某个(或某些)网站。包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中
- Node.js版本管理工具。Git地址:https://github.com/nvm-sh/nvm安装nvmMac OS:如果已经安装了no
- 其实网上已经有很多ASP生成htm的文章了,有一种方法是ASP+XML的生成方法,虽然有一种好处就是不用程序写模版就可以直接引用原来的要生成