关于Run Time Package,ShareMem,CoInitialize的问题,请高手帮忙,up有分!
数据模块dataunit.dll中输出一个函数,生成一个DataModule对象并返回它.
字窗体TestDLLForm.dll中输出一个函数,生成一个Form对象并返回它.
主程序引入这两个动态库函数,在OnCreate时调用它们,生成一个DataModule和Form, OnDestroy时释放这
两个对象.
这个程序在不使用Run Time Package时,没有问题.但是,如果使用了Run Time
Package,主程序在释放DataModule时就会报错,这是什么原因?
另外,按照帮助文档:在动态库输出的函数中,如果传递的参数用到了字符串和动态数组(或是内嵌了字符串
和动态数组),就应该uses sharemem. 我这里传递的参数是TObject的子类,它的很多属性都是字符串,按理
需要uses sharemem,但是我没有用,也没出错,这是什么原因?
动态库中用到了TXmlDocument控件时,就一定要调用 CoInitialize(nil)和 CoUninitialize.调用它们的
主程序是否也需要调这两个函数?
以下是我的源程序
一.主程序是一个简单的窗体,如下
//main.pas
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Main, xmldom, XMLIntf, msxmldom, XMLDoc;
type
TMainFrmImp = class(TForm)
XMLDocument1: TXMLDocument;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure LoadShareData;//从动态库中加载数据模块
procedure LoadChildForm;//从动态库中加载子窗体
public
{ Public declarations }
DataModule:TDataModule;
ChildForm:TForm;
end;
var
MainFrmImp: TMainFrmImp;
implementation
function CreateShareData(AHandle:THandle;AOwner:TMainFrmImp):TDataModule;
stdcall;external '..\sharedata\dataunit.dll';
function CreateForm(AHandle:THandle;MainFrm:TMainFrmImp):TForm;
stdcall;external '..\DllForm\TestDLLForm.dll';
{$R *.dfm}
procedure TMainFrmImp.FormDestroy(Sender: TObject);
begin
if Assigned(DataModule) then
DataModule.Free;
if Assigned(ChildForm) then
ChildForm.Free;
end;
procedure TMainFrmImp.FormCreate(Sender: TObject);
begin
LoadShareData;
LoadChildForm;
end;
procedure TMainFrmImp.LoadChildForm;
begin
ChildForm:=CreateForm(Application.Handle,Self);
ChildForm.Show;
end;
procedure TMainFrmImp.LoadShareData;
begin
DataModule:=CreateShareData(Application.Handle,Self);
end;
end.
这个程序在启动时从动态库中加载子窗体和数据模块,关闭时释放它们.
二.数据模块 把一个DataModule放在一个动态库中,exports一个函数来生成它
//sharedata.pas
unit sharedata;
interface
uses
ActiveX,SysUtils, Classes,Main,Forms, xmldom, XMLIntf, msxmldom, XMLDoc;
type
TShareDataModule = class(TDataModule)
XMLDocument1: TXMLDocument;
private
{ Private declarations }
public
{ Public declarations }
MainForm:TMainFrmImp;
end;
var
ShareDataModule: TShareDataModule;
function CreateShareData(AHandle:THandle;AOwner:TMainFrmImp):TDataModule;stdcall;
implementation
{$R *.dfm}
function CreateShareData(AHandle:THandle;AOwner:TMainFrmImp):TDataModule;
begin
Application.Handle:=AHandle;
ShareDataModule:=TShareDataModule.Create(Application);
ShareDataModule.MainForm:=AOwner;
result:= ShareDataModule;
end;
initialization
CoInitialize(nil);
finalization
CoUninitialize;
end.
三.子窗体 把一个Form放在一个动态库中,exports一个函数来生成它
unit FormUnit;
interface
uses
ActiveX,Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,Main, xmldom, XMLIntf, msxmldom, XMLDoc;
type
TFrmTest = class(TForm)
XMLDocument1: TXMLDocument;
private
{ Private declarations }
public
{ Public declarations }
end;
var
FrmTest: TFrmTest;
function CreateForm(AHandle:THandle;MainFrm:TMainFrmImp):TForm;stdcall;
implementation
function CreateForm(AHandle:THandle;MainFrm:TMainFrmImp):TForm;
begin
Application.Handle:=AHandle;
FrmTest:=TFrmTest.Create(Application);
result:=FrmTest;
end;
{$R *.dfm}
initialization
CoInitialize(nil);
finalization
CoUninitialize;
end.
相关推荐
谷歌云Cloud Run轻量服务器技术解析与实战
无服务器计算(Serverless)通过事件驱动架构实现资源自动扩缩,其核心技术原理是将应用拆分为细粒度函数或容器,按需分配计算资源。Cloud Run作为谷歌云的无服务器容器平台,采用创新的请求驱动模型,支持毫秒级资源调度和按100毫秒粒度的精准计费。相比传统虚拟机服务,这种架构特别适合流量波动大的Web应用、API服务和事件处理场景,能显著降低闲置资源成本。通过容器化改造和合理的并发参数配置,开发者可以平衡冷启动延迟与资源利用率,典型应用包括电商秒杀系统、在线文档处理等瞬时高并发场景。
电信运营基于分类模型的客户流失预警系统:数据挖掘驱动的精准挽留策略设计
内容概要:本文围绕电信客户流失预警与挽留策略,构建了一套从数据探索、预处理、特征工程、分类建模、模型评估与解释到业务落地的端到端数据挖掘实战方案。基于公开的 Telco Customer Churn 数据集,项目聚焦于识别高流失风险客户,并通过逻辑回归、随机森林和XGBoost等模型进行对比分析,结合ROC-AUC、精确率、召回率、F1等指标评估性能,利用SHAP等方法实现模型可解释性,最终将预测结果转化为可操作的客户分层与差异化挽留策略。文中强调了数据泄漏防范、类别不平衡处理、模型可复现性及A/B测试验证增量收益的重要性,并明确指出当前图表为示意性质,需通过附录代码运行真实数据生成结果。; 适合人群:具备一定数据分析与机器学习基础,从事数据科学、用户运营或客户留存相关工作的从业者,尤其是工作1-3年希望提升实战能力的研发与分析人员。; 使用场景及目标:①掌握客户流失预测的全流程方法论,包括数据清洗、特征工程、建模调参与模型解释;②学习如何将机器学习模型输出转化为可运营的客户触达策略;③理解模型评估与业务目标之间的衔接,如预算约束下的优先级排序与A/B测试设计; 阅读建议:此资源以实际业务场景驱动,不仅关注算法实现,更重视从业务定义到策略落地的闭环逻辑。建议结合附录提供的完整Python代码,在本地环境中下载数据集并复现分析流程,重点关注数据预处理防泄漏机制、模型管道构建、超参数调优策略及SHAP解释应用,避免将文中的示意图表误认为实测结果。
旋转高频信号注入法在PMSM零低速无位置控制中的仿真研究(Matlab代码实现)
内容概要:本文系统研究了旋转高频信号注入法在永磁同步电机(PMSM)零低速无位置传感器控制中的应用,并提供了基于Matlab/Simulink的完整仿真代码实现。针对PMSM在启动及低速运行时反电动势微弱导致传统观测器失效的问题,该方法通过在定子绕组中注入高频旋转电压信号,利用电机自身凸极效应产生的响应电流特征,实现对转子位置的高精度在线估计。文中详细阐述了该技术的理论基础、数学建模过程、仿真系统架构设计以及关键参数整定方法,全面验证了其在零速和低速工况下对转子初始位置辨识与动态跟踪的准确性、有效性及强鲁棒性。; 适合人群:具备电机控制理论基础知识和Matlab/Simulink仿真能力的电气工程、自动化、电力电子等相关专业的硕士研究生、博士研究生、科研人员以及从事高性能电机驱动系统研发的工程师。; 使用场景及目标:① 深入理解高频信号注入类无位置传感器控制技术的工作原理、信号处理机制与工程实现细节;② 掌握利用Matlab/Simulink搭建PMSM高性能矢量控制系统及高级观测器的仿真方法;③ 为开发高精度、低成本、全速度范围适用的PMSM无位置传感器驱动器提供坚实的理论依据和技术验证平台。; 阅读建议:建议读者结合文中详尽的理论推导与所提供的仿真代码进行对照学习,亲自动手运行、调试仿真模型,通过改变负载、转速、注入信号参数等工况,观察系统响应与控制效果的变化,从而深刻掌握旋转高频注入法的内在工作机制与设计要点。
Python小Demo实例源码爬取网易云音乐评论
Python小Demo实例源码爬取网易云音乐评论
Python3 finally执行铁律
finally代码块无论try内部是否报错、是否执行return,都会强制执行。唯一例外:调用os._exit()直接终止解释器,跳过finally。业务场景:数据库连接、网络套接字、文件句柄回收,放入finally保证资源释放。特殊细节:try内部return不会立刻返回,会先执行finally内部代码,再返回结果。新手易错:在finally内部写入return,会覆盖try原有返回值,导致业务数据异常,严禁在finally使用return语句。 tiyu.xastone.com www.yingjie168.com 17kuaibu.com www.0760yx.net 1900kk.com


