Delphi 调用 DLL 里面的 C 函数传递字符串

Delphi编写DLL(以及静态和动态方式调用) 阅读详情

Delphi 专家李维有篇文章,针对本文标题的情况,介绍了一种代码的写法。

前提:

用 C 写的 DLL,如果传递的参数是字符串,通常是传递指针 Char*,对应到 Delphi 的数据类型是 PAnsiChar;这个 PAnsiChar 其实也就是个指针 Pointer;就好比说,这个白马它其实就是个马。

研究:

我没有 C 编译器用来做一个 DLL。所以,我在 Delphi 里面写了一个模拟的函数,关键是把函数的参数的类型都用 PAnsiChar 这个类型,就能很好地模拟了。

 我的模拟 DLL 的 C 函数:

procedure TForm1.AddStr(Str1, Str2: PAnsiChar;  OutStr: PAnsiChar);
var
  S: AnsiString;
begin
  //模拟 C 函数的 Char*
  S := AnsiString(Str1) + AnsiString(Str2);
  Move(S[1], OutStr^, Length(S));
  //OutStr := PAnsiChar(S); //这里的 S 离开这个函数就不存在了,因此,把 S 的指针传出去,是有问题的。
  //因为 OutStr 这个指针是外部传入的,在外部已经分配好内存了,这里只需要往里面填数据,
  //因此这个 OutStr 不能定义为 var 的。
end;

有了上述函数,我先用普通的 Delphi 的代码去调用它,测试一下。

普通的代码如下:

procedure TForm1.Button1Click(Sender: TObject);
var
  OutStr: PAnsiChar;
  Str1, Str2: PAnsiChar;
  S, S1, S2: AnsiString;
begin
  S1 := Edit1.Text;
  S2 := Edit2.Text;
  Str1 := PAnsiChar(S1);
  Str2 := PAnsiChar(S2);

  GetMem(OutStr, 1024);
  try
    Self.AddStr(Str1, Str2, OutStr); //采用指针调用 C 函数

    S := AnsiString(OutStr);
    Memo1.Lines.Add(S);
  finally
    FreeMem(OutStr);
  end;
end;

上述代码,测试成功。处理英文和汉字混合的字符串也没有问题。

李维推荐的新的写法:

procedure TForm1.Button2Click(Sender: TObject);
var
  M: TMarshaller;
  pOutData : TPtrWrapper;
  sOutData : String;
begin
  //李维介绍的写法 https://gordonliwei.wordpress.com/2021/12/
  
  try
    pOutData := TMarshal.AllocMem(2048);

    Self.AddStr(M.AsAnsi(Edit1.Text).ToPointer,
      M.AsAnsi(Edit2.Text).ToPointer,
      pOutData.ToPointer);
  finally
    sOutData := TMarshal.ReadStringAsAnsi( pOutData, -1);
    TMarshal.FreeMem(pOutData);
  end;
  Memo1.Lines.Add(sOutData);
end;

上述代码同样测试通过。这里的原理是采用 TMarshaller 这个东西的一些方法来做字符串和指针之间的转换。

要注意的问题:

这里,AddStr 函数的参数都是 PAnsiStr。一开始写这个代码时,OutStr 因为是输出,我习惯性地给它加了一个 var 在前面。然后,第二种方式,编译时提示 pOutData.ToPointer 这里类型不对。

我以为这里是 Pointer 和 PAnsiChar 的类型不匹配导致,因此把 AddStr 的参数全部改为 Pointer 类型。结果仍然提示类型不对。最后把 AddStr 的参数里面的 var 去掉,才编译通过。

然后就有问题了。当 AddStr 的三个参数的类型都是 Pointer 的时候,第一种传统写法的代码,运行结果正常。但第二种代码,运行结果出错。设置断点跟踪,发现传进去 AddStr 函数里面的指针是空指针。

最后,把 AddStr 的参数的类型从 Pointer 改为 PAnsiChar 后,一切都正常了。

M.AsAnsi(Edit1.Text).ToPointer 给出的东西就是一个 Pointer 类型的指针,为啥传递给 AddStr 的时候,如果 AddStr 的参数是指针 Pointer,它反倒没内容,是 PAnsiChar 却又正确了?

结论:

对于 DLL 里面的接口函数 C 函数的参数类型为 Char*  的调用,李维推荐的代码写法测试通过。

c#调用delphi写的dll遇到并解决的问题 c#调用delphi写的dll,需要以一级指针、二级指针作为参数传递。 阅读详情

相关推荐

PowerBuilder调用Delphi写的Dll时发生的奇怪问题。

  因项目需要,我用Delphi写了一个连接数据库把数据导出到Sql文件的dll,其中使用了TADOQuery组件。其中只有一个导出方法:function DataExport(path,ini_path:PChar):integer;   写完之后,用delphi写了一个test.exe进行测试,发现可以正常使用。之后便把这个dll交给了同事,让他在PowerBuilder中调用。同事拿过去之后

党宇航 的专栏 3955

关于Delphi下PAnsiChar的使用

与C语言对应的类型为char *,意为单字节字符串指针,在Delphi下的string类型是带引用计数的,有专门的内存管理sharemm单元,在dll之间引用该单元后可以导出使用string参数的导出函数,供delphi编译的exe使用(要注意delphi版本差异) 反之,delphi实现的功能要供其它语言调用时,字符串只能使用PAnsiChar或PChar,下面仅以PAnsiChar举例(PChar类同) 一、作用域问题 返回值或可变参数为PAnsiChar时,必须申请内存(通常是被调用方申请,调用

cmd9x的专栏 4059

逆向解析M团外卖mtgsig与waimai_sign加密参数实战指南⊙ω⊙

本文详细解析了M团外卖App中mtgsig与waimai_sign两个核心加密参数的逆向分析与生成方法。通过抓包定位、静态逆向与Frida动态调试,拆解了waimai_sign的RSA签名逻辑与mtgsig的复杂参数组装加密流程,并提供了Python模拟实现的框架与调试心得,为安全研究及合规数据分析提供实战指南。

weixin_29327525的博客 1283

Delphi中的字符串(转)

widestring转换成pchar Delphi有三种类型的字符: •AnsiChar这是标准的1字节的ANSI字符,程序员都对它比较熟悉。 •WideChar这是2字节的Unicode字符。 •Char在目前相当于AnsiChar,但在Delphi以后版本中相当于WideChar. 记住因为一个字符在长度上并不表示一个字节,所以不能在应用程序中对字符长度...

518

RL调参侠之BipedalWalker BipedalWalkerHardcore SAC

前几天用PPO训练了个很一般的agent: RL调参侠之BipedalWalker PPO 我看SpinningUp上面说PPO和SAC是两个领域里各自的State_of_the_art的方法,所以就打算跑SAC试试看,之前因为Open AI Five的原因,一直感觉PPO很牛掰,实际上现在很多自动驾驶的算法也是用PPO在跑,毕竟有一个“必定能够提升期望”的理论保证在这里,我理解这对做项目很大的诱惑。 不过我跑出来的结果明显是SAC更好。 调参侠时间 策略熵的权重alpha用的0.2,我一开始没有看SAC的

weixin_48370148的博客 2100

常用的串口通信工具MobaXterm、Bus Hound、SScom等

本文介绍了四种PC端串口通信工具的功能和使用方法:MobaXterm支持SSH、FTP、串口等多种协议;Bus Hound用于监控CAN和串口数据;SScom专为串口和网口通信设计;ScriptCommunicator可进行串口通信并绘制波形图。每种工具都有详细的操作步骤图示,包括参数设置、数据监控等关键功能,并提供了官方和个人下载地址。这些工具各有特点,适用于不同的串口通信和数据分析场景。

sanqima的专栏 2492

DllImport属性详解

API函数是构筑Windows的基石, 是Windows编程的必备利器。每一种Windows应用程序开发工具都提供间接或者直接的方式调用Win32API,C#也不例外。使用Win32API的一个好处就是,我们可以实现更多的功能。 首先,要引入命名空间:using System.Runtime.InteropServices; 然后,声明在程序中所要用到的API函数。注意方法体为空。

u010141129的专栏 5820

车载以太网SOMEIP入门必看:从服务发现到事件订阅,一次搞懂三种核心通信模式(附报文实例)

本文深入解析车载以太网SOME/IP的三种核心通信模式:服务发现、方法调用和事件订阅,通过真实报文实例和仿真工具演示,帮助开发者快速掌握这一关键技术。文章特别强调服务发现机制的基础作用,并详细介绍了Request/Response与Fire&Forget两种方法调用模式的应用场景,为智能汽车网络通信开发提供实用指南。

weixin_30955617的博客 111

delphi dll调用问题

dll传递string实现方法 delphi中dll传递string的实现方法: dll项目uses第一个引用sharemem单元; 调用的项目uses第一个引用sharemem单元; 调用的单元uses第一个引用sharemem单元; ************************************************************** delphi中d...

dkopg24406的专栏 691

rk3568 修改开机动画

bootanimation.zip是一个Android设备启动时播放的动画文件,它包含了一系列的图片和描述文件,用于描述动画的播放顺序和持续时间。

weixin_35723192的博客 2727

扫地机器人行业 企业篇-产业总部地理分布

中国扫地机器人产业呈现区域集聚特征,广东省以13家企业领跑全国,其中深圳独占9家(如大疆、云鲸智能等),佛山、广州、东莞各有分布。江苏省6家企业主要集中在苏州(科沃斯、追觅科技等)。北京聚集了石头科技、小米等4家品牌。浙江、山东、湖南等地也有代表性企业分布。国际品牌方面,美国iRobot、韩国三星/LG、日本松下等均在各自国家设立总部,而戴森、飞利浦等欧洲品牌则将中国运营中心设在上海或苏州。值得注意的是,部分品牌如由利、宝家丽虽为外资起源,但主要运营实体已落户中国。

智能硬件研发,欢迎交流 362

Delphi DLL 字符串传递例子

Delphi DLL 字符串传递例子 library EN; uses SysUtils, Classes, UnitFormEN in 'UnitFormEN.pas' {FormEN}; {$R *.res} function GetJobType(p: PChar): Boolean; stdcall; var str: string; be...

强仔 433

喷涂机器人系列编程:ABB IRB 5500_(9).常见故障诊断与排除

ABB IRB 5500 喷涂机器人在实际应用中可能会遇到各种故障,但通过系统的诊断和排除方法,可以确保生产线的连续运行。定期维护和保养是预防故障的重要手段,而操作培训和规范则能有效减少人为因素引起的故障。希望本节内容能帮助操作和维护人员提高故障诊断和排除的效率,确保喷涂机器人的稳定运行。如果您有任何疑问或需要进一步的帮助,请联系 ABB 客户服务中心。

zhubeibei168的博客 1045

DLL、BPL与字符串传递

在我开发基于动态代理的轻量容器过程中,动态装入外部的客户自定义接口/类/组件功能是一个必要的组成部分。对于应该选择用DLL还是BPL来作为自定义组件的实现方式一直不能确定。在反复的试验过程中,发现了一些其中的技术细节,特别是在用字符串类型作为参数或返回值的情况下。凡是用DELPHI开发过DLL的,都知道DELPHI的DLL向导生成的代码中,在DLL Project Source一开头就有一

猛禽的编程艺术 6078

Codex 实战 Skills:用 Skill 自动识别并提取 PDF/图片表格数据,效率提升 10 倍

本文介绍如何构建一个多模态文件解析 Skill,用于自动识别和提取 PDF/图片中的表格数据,提升 AI 智能体处理非结构化文档的效率。文章分析了传统方法的局限性,提出分层解析架构(预处理、检测、提取推理、后处理),推荐技术栈包括 pdfplumber、OpenCV 和多模态大模型。详细说明了 Skill 的元数据定义、数据模型设计(使用 Pydantic)和核心实现流程,通过混合策略实现从复杂文档到结构化 JSON/Markdown 的转换,使 AI 代理具备"阅读"多模态文档的能力。

yueyeguzhuo的专栏 306

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Delphi 调用 go dll

Delphi 调用 go dll 只需要用两个C.GoString C.CString go 的dll 代码

m0_37684144的博客 1033

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

DELPHI调用VC编写的DLL 函数参数为LPTSTR

注意点:LPTSTR 对应的是PAnsiChar 或者PWideChar 你问问他的编译选项,要是定义了unicode就是PWideChar 否则是PAnsiChar 这里我是用UNICODE编程的,所以用到的是PWideChar 在VC写的A.dll里添加一个函数为extern "C" __declspec(dllexport) LPTSTR WINAPI Do(LPTSTR

独爱糕 2392

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

delphi 基础之三 编写和调用dll文件

delphi 编写和调用dll文件 Windows 的执行文件可以划分为两种形式程序和动态连接库 (DLLs)。一般程序运行是用.EXE文件,但应用程序有时也可以调用存储在DLL的函数。 在如下几种情况下,调用DLL 是合理的: 1) 不同的程序使用相同的DLL ,这样只需要将DLL 在内存中装载一次,节省了内存的开销。 2) 当某些内容需要升级的时候,如果使用DLL 只需要改...

weixin_30466421的博客 1134

VC调用Delphi制作的动态链接库如何互相传递字符串

1、VC to Delphi Delphi源程序: libraryExportChartData; uses SysUtils, Classes; {$R*.res} const DLL_VER:Word=$0001; functionGetVer:Word; begin Result:=...

dddaaa1234的博客 289

java调用delphi dll文件_【java】试用JNA调用Delphi的dll方法。

参考文章:http://hi.baidu.com/zuchang319/blog/item/39e7373cf432d2ca9e3d629f.html首先对方写给我一个dll的方法。可是最开始的时候对方发送来的是一个string的字符串,对于Delphi而言。String应该是一个指针(这个是我本身猜测的)。而后我是用一下方法进行调用。package com.duduli.li;import co...

weixin_32771227的博客 496

避免踩坑:Delphi与C++ DLL交互中的常见问题及解决方案

本文深入探讨了Delphi与C++ DLL交互中的核心挑战与解决方案,重点剖析了函数调用约定、数据类型映射、内存管理权责以及代理DLL模式等关键问题。针对字符串处理、结构体对齐和C++类调用等常见陷阱,提供了经过验证的实战代码示例和最佳实践,帮助开发者构建稳定、高效的跨语言模块交互桥梁。

lake5的博客 510

vb 调用delphi写的dll

delphi中的DLL中的声明原码如下:这里声明了输出性参数分别为数字与字符类型 library dll1;uses  SysUtils,  Classes;{$R *.res}Function mymax(x, y: Integer; out jj: Integer; out abc: PChar): Integer; stdcall;begin  jj := x * y

hhzbl的专栏 946

delphi 调用c/c++函数dll的坑

小知识C++中以&的参数在Delphi必须以const或者var申明,否则会产生错误。WIN32PROJECT1_API void test8(RECT &a) { a.left = 1; a.top = 2; a.right = 3; a.bottom = 4; } 此时参数为 RECT &a,在Delphi中有两种申明方式,各有不同 方式一 var procedur

云守护的专栏 6257

delphi调用python文件_Python 如何调用Delphi动态联接库

python 从 2.5 开始支持 调用动态联接库中的函数,我们可以用C或delphi 为其开发动态联接库。我们以 stdcall 调用格式的函数为例说明-------------------------------------------------------1 基本数据类型python的c_types C delphic_int int integerc_double double doub...

weixin_39540020的博客 415

Delphi中如何把函数代码调出主程序,写到“DLL”中并调用

一、开使你的第一个DLL专案 1.File->Close all->File->New[DLL] 代码: //自动产生Code如下 library Project2; //这有段废话 uses SysUtils, Classes; {$R *.RES} begin end. 2.加个Func进来: 代码:

q304929130的专栏 2361
上一篇: 把 DBGridEh 表格内容导出为 Excel 文件
下一篇: 把 TObjectList 序列化为 JSON
pcplayer
博客等级 码龄26年 633粉丝 284原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值