程序有时候能运行,有时候不能运行!!!!

tanglitao 2012-10-31 06:00:14
最近用Delphi2010 开发了一个小程序,包括:两个组件、一个Dll ,在Dll中动态创建几个组件,另外写了一个测试程序(projec1.exe),用于调用Dll ,但是,不知道怎么回事,在按F9 以后,程序启动半截,就没有反应了,需要在进程里强制结束project1.exe;然而,有时候就成功运行了,真是郁闷!需要说明的时候,编译出来的程序,可以单独正常执行!


在调试运行时,总是运行到这(运行信息):Module Load:srvcli.dll . No Debug Info. Base Address:$75670000. Process project1.exe ,程序就不往下执行了!!!


只要一调这个接口函数——即使函数什么都不做,就会有问题:
procedure DisPlay_Init(AppHandle, ParentForm: HWND; width, Height: integer;
Conn: PConn; ServerIP, RemotePort: ShortString); stdcall;
begin
{ if FrmDisplay = nil then
FrmDisplay := TFrmDisplay.Create(nil);
FrmDisplay.ParentWindow := ParentForm;
FrmDisplay.Left := 0;
FrmDisplay.Top := 0;
FrmDisplay.width := width;
FrmDisplay.Height := Height;
FrmDisplay.AppHWND := AppHandle;
FrmDisplay.Init(Conn, ServerIP, RemotePort);
FrmDisplay.Show; }
end;



...全文
519 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanglitao 2013-08-05
  • 打赏
  • 举报
回复
终于找到原因了,在DLL或者VCL 中,不能饮用acPNG,至于为何,不知道,把所有图片改为了jpg格式,然后引用jpeg单元即可。
tanglitao 2013-08-01
  • 打赏
  • 举报
回复
说明:用上述代码做的组件,直接放到应用程序中,程序可以正常编译及运行;但是在DLL中form中引用该单元,应用程序在调用DLL时,即按F9运行时,程序有时候能正常启动,有时候不能启动(大部分如此);但“Run WithOut Debugging”没有问题;郁闷!!!!
tanglitao 2013-08-01
  • 打赏
  • 举报
回复
问题一直没有解决,现将VCL的代码贴出来,高手给指点一下: unit Panel_Guns; interface uses SysUtils, Classes, Controls, ExtCtrls, StdCtrls, Graphics, Messages, jpeg; const OPLock = WM_USER + 100; type TGunMess = procedure(DevCode, DataLen: byte; StatusData: TBytes) of object; TGun = class(TPanel) private FDevCode: integer; FRight: boolean; FDevName: ShortString; FGunType: ShortString; // 类型 FActive: boolean; // 是否为活动状态 FOnStatus: TGunMess; FGunCode: ShortString; FLockStatus_Chl: shortint; // 锁状态 FLockCon_Chl: shortint; // 开关通道 FHaveGun_Chl: shortint; // 检测 通道 FGunLong: shortint; // // FStatus_Chl: shortint; // 检测 通道 Image_Gun: TImage; // 显示图片 Image_Lock: TImage; // 显示锁的状态 // LGunCode: TLabel; // 显示号 // LGunLock: TLabel; // 信息显示 // Timer : TTimer; //在锁打开后,闪烁 procedure OpenLockMsg(var MSG: TMessage); message OPLock; procedure OpenLock(); procedure QueryStatus(); { Private declarations } protected procedure SetDevName(dName: ShortString); procedure Resize(Sender: TObject); procedure SetActive(Flag: boolean); procedure SetGunLong(GunLength: shortint); procedure SetGunCode(Code: ShortString); procedure DblClick(Sender: TObject); procedure DoDBClick(Sender: TObject); procedure OnTimer(Sender: TObject); { Protected declarations } public LockStatus, HaveGun: integer; constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure ProcessData(DataLen: integer; Datas: TBytes); { Public declarations } published property OnGunStatusChange: TGunMess read FOnStatus write FOnStatus; property Active: boolean read FActive Write SetActive; property DevName: ShortString read FDevName Write SetDevName; property DevCode: integer read FDevCode Write FDevCode; property GunCode: ShortString read FGunCode Write FGunCode; property HaveGun_Chl: shortint Read FHaveGun_Chl Write FHaveGun_Chl; property LockStatus_Chl : shortint Read FLockStatus_Chl write FLockStatus_Chl; property LockCon_Chl: shortint Read FLockCon_Chl write FLockCon_Chl; property OpenRight: boolean read FRight write FRight; property GunType: ShortString read FGunType write FGunType; property GunLongOrShort: shortint read FGunLong write SetGunLong; { Published declarations } end; procedure Register; implementation uses GunForm; procedure Register; begin RegisterComponents('Standard', [TGun]); end; constructor TGun.Create(AOwner: TComponent); begin inherited; color := $BCEE68; BevelOuter := bvNone; BevelKind := bkNone; width := 69; height := 109; Image_Gun := TImage.Create(self); Image_Gun.Parent := self; Image_Gun.Transparent := false; Image_Gun.AutoSize := false; Image_Gun.Center := false; Image_Gun.Align := alNone; Image_Gun.Left := -1000; Image_Gun.OnDblClick := DoDBClick; Image_Gun.Cursor := crHandPoint; Image_Gun.Stretch := true; Image_Gun.Proportional := true; Image_Gun.width := 67; Image_Gun.height := 47; Image_Lock := TImage.Create(self); Image_Lock.Parent := self; Image_Lock.Transparent := false; Image_Lock.AutoSize := false; Image_Lock.Center := false; Image_Lock.Align := alNone; Image_Lock.Left := -1000; Image_Lock.OnDblClick := DoDBClick; Image_Lock.Cursor := crHandPoint; Image_Lock.Stretch := true; Image_Lock.Proportional := true; Image_Lock.width := 67; Image_Lock.height := 60; FRight := false; FGunLong := 0; // end; destructor TGun.Destroy; begin if Image_Gun <> nil then // 2012-11-19 释放动态创建的 组件 begin Image_Gun.Free; Image_Gun := nil; end; if Image_Lock <> nil then begin Image_Lock.Free; Image_Lock := nil; end; inherited; if FGunControl <> nil then FGunControl.Free; FGunControl := nil; end; procedure TGun.OnTimer(Sender: TObject); begin { if LockStatus = 1 then begin LGunLock.Color := clBtnFace; end else begin if not (LGunLock.Color = clYellow) then LGunLock.Color := clYellow else LgunLock.Color := clGreen; end; } end; procedure TGun.OpenLockMsg(var MSG: TMessage); var d: TBytes; t: integer; begin case MSG.WParam of 0: OpenLock(); 1: QueryStatus(); 3: begin SetLength(d, 5); d[0] := $4F; d[1] := 1; d[2] := FLockCon_Chl; d[3] := 0; d[4] := $29; FOnStatus(FDevCode, 5, d); end; end; end; procedure TGun.QueryStatus(); // 发送查询状态命令 var d: TBytes; begin SetLength(d, 4); d[0] := $4F; d[1] := 0; d[2] := FLockStatus_Chl; d[3] := $29; FOnStatus(FDevCode, 4, d); sleep(200); d[2] := FHaveGun_Chl; FOnStatus(FDevCode, 4, d); end; procedure TGun.OpenLock(); // 发送打开锁命令 var d: TBytes; t: integer; begin SetLength(d, 5); d[0] := $4F; d[1] := 1; d[2] := FLockCon_Chl; d[3] := 0; // 闭合 d[4] := $29; FOnStatus(FDevCode, 5, d); { t := StrToInt(FGunControl.Ebacktime.Text); sleep(t); d[3] := 1; // 断开 FOnStatus(FDevCode, 5, d); } // 2012-6-17 注释 end; procedure TGun.ProcessData(DataLen: integer; Datas: TBytes); // 推入要处理的数据 var i: integer; begin if (Datas[0] = $AA) and (Datas[DataLen - 1] = $BB) then begin if Datas[1] = 2 then // 查询输入状态的 返回值 begin // Datas[3] = 0 '闭合 ,1- '断开'//通道闭合——锁开 if Datas[2] = FLockStatus_Chl then begin LockStatus := Datas[3]; if FGunControl = nil then FGunControl := TFGunControl.Create(nil); if LockStatus = 1 then begin { LGunLock.Font.color := $EE0000; LGunLock.Caption := '锁定'; } Image_Lock.Picture := FGunControl.Img_Lock.Picture; end else begin { LGunLock.Font.color := 255; LGunLock.Caption := ' 开启'; } Image_Lock.Picture := FGunControl.Img_unLock.Picture; end; end; if Datas[2] = FHaveGun_Chl then begin HaveGun := Datas[3]; Image_Gun.Picture.Assign(nil); Image_Gun.Update; if HaveGun = 1 then begin if FGunLong = 1 then // Image_Gun.Picture := FGunControl.Img_LongGun_N.Picture else Image_Gun.Picture := FGunControl.Img_ShortGun_N.Picture; end else begin if FGunLong = 0 then Image_Gun.Picture := FGunControl.Img_ShortGun_H.Picture else Image_Gun.Picture := FGunControl.Img_LongGun_H.Picture; end; end; end; if Datas[1] = 1 then // begin // Datas[2] -通道编号 , Datas[3] = 0 '闭合 ,1- '断开' if Datas[2] = FLockStatus_Chl then // 通道闭合——锁开 begin LockStatus := Datas[3]; if LockStatus = 1 then begin { LGunLock.Font.color := $EE0000; LGunLock.Caption := '锁定'; } Image_Lock.Picture := FGunControl.Img_Lock.Picture; end else begin { LGunLock.Font.color := 255; LGunLock.Caption := '开启'; } Image_Lock.Picture := FGunControl.Img_unLock.Picture; end; end; if Datas[2] = FHaveGun_Chl then begin HaveGun := Datas[3]; if HaveGun = 1 then // 没有 begin if FGunLong = 1 then // Image_Gun.Picture := FGunControl.Img_LongGun_N.Picture else Image_Gun.Picture := FGunControl.Img_ShortGun_N.Picture end else begin if FGunLong = 0 then Image_Gun.Picture := FGunControl.Img_ShortGun_H.Picture else Image_Gun.Picture := FGunControl.Img_LongGun_H.Picture end; end; end; // 上报的IO 输出状态 if Datas[1] = 3 then begin // Datas[2] -通道编号 ,Datas[3]-IO输出状态,0有输出,1-无输出 end; end; end; procedure TGun.DblClick(Sender: TObject); begin if FGunControl <> nil then begin FGunControl.pp := handle; // FGunControl.Show(); end; FGunControl.BopenLock.Enabled := FRight; FGunControl.Caption := ':' + FGunCode; end; procedure TGun.DoDBClick(Sender: TObject); begin DblClick(Sender); end; procedure TGun.Resize(Sender: TObject); // 重载改变大小 begin end; procedure TGun.SetDevName(dName: ShortString); // 设置防区名称 begin FDevName := dName; end; procedure TGun.SetGunLong(GunLength: shortint); // 设置长度 begin FGunLong := GunLength; if FGunLong = 1 then begin height := 239; Image_Gun.height := 177; end else begin height := 109; Image_Gun.height := 47; end; end; procedure TGun.SetActive(Flag: boolean); // 设置活动状态 begin FActive := Flag; if Flag = true then begin color := clGray; Image_Gun.AutoSize := false; // true; Image_Gun.Center := true; if FGunLong = 0 then Image_Gun.height := 47 else Image_Gun.height := 177; Image_Gun.Left := 0; Image_Gun.Top := 0; Image_Gun.Left := 1; Image_Lock.Left := 1; Image_Lock.Top := Image_Gun.height + 1; if FGunControl = nil then FGunControl := TFGunControl.Create(nil); FGunControl.pp := handle; end else begin Image_Gun.AutoSize := false; Image_Gun.Center := false; Image_Gun.Stretch := false; Image_Gun.Align := alNone; Image_Gun.Left := -1000; Image_Lock.Align := alNone; Image_Lock.Left := -1000; // LGunLock.Left := -1000; color := $BCEE68; end; end; procedure TGun.SetGunCode(Code: ShortString); begin FGunCode := Code; // LGunCode.Caption := Code; end; end.
hhhfff2010 2013-03-15
  • 打赏
  • 举报
回复
断点调试一下看看,关闭时,是否释放了DLL或者你引用组件,
simonhehe 2013-03-15
  • 打赏
  • 举报
回复
通过dll调试吧 dll项目的run菜单->paramaters->host application, 设置为可执行程序路径
静_海 2013-03-15
  • 打赏
  • 举报
回复
在你的 Panel 组件程序中用 try 结构捕捉异常,如何?
tanglitao 2013-03-14
  • 打赏
  • 举报
回复
终于找到根了,在DLL中,用了自己开发的组件(基于Panel)的,若不引用自定义的组件,就没有问题,能够正常执行,只要引用了自定义组件的单元,就会出现问题! 在开发基于Panel的组件时,有什么注意事项吗?
bdmh 2012-11-07
  • 打赏
  • 举报
回复
调试dll,看看哪里出错
tanglitao 2012-11-07
  • 打赏
  • 举报
回复
冷门,自己顶一下
UnkownState 2012-11-01
  • 打赏
  • 举报
回复
dll的入口点EntryPoint函数做了什么。是不是调用约定不一样。也许问题不在dll上。
一、Docker解决了什么问题?         一款产品从开发到上线,从操作系统,到环境运行,在到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司不得不面对的问题,特别是各版本的迭代之后,不同版本环境的兼容,对运维人员都是考验。         Docker对此给出了一个标准化的解决方案。         环境配置如此麻烦,换一台机器,就要重来一次,费力费时。那么软件可以不可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用Docker可以消除协作编码时“在我的机器上可以正常工作”的问题。           传统上认为,软件编码开发/测试结束后,所产出的成果就是程序或是能够编译执行的二进制字节码等。而为了让这些程序可以顺利执行,开发团队也得准备完善的部署文件,让运维团队得以部署应用程序,开发需要清楚的告诉运维部署团队,用的全部配置文件+所有软件环境。不过,即便如此,仍然经常发生部署失败的情况。Docker镜像的设计,使得Docker得以打破过去【程序即应用】的观念。透过镜像(image)将作业系统核心除外,运作应用程序所需要的系统环境,由上而下打包,达到应用程序快平台的无法接轨运作。 二、Docker是个啥         Docker是基于Go语言实现的云开源项目。         Docker的主要目标是“Build,Ship and Run Any APP,Anywhere”,也就是通过对应组件的封装、分发、部署、运行等生命周期的管理,是用户的App及其运行环境能够做到“一次封装,到处运行”。         Linux容器技术的出现就解决了这样一个问题,而Docker就是在它的基础上发展过来的。将应用运行的Docker容器上面,而Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机器上就可以一键部署好,大大简化了操作         Docker解决了运行环境和配置软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。 三、虚拟机与Docker         虚拟机就是带环境安装的一种解决方案。         它可以在一种操作系统里面运行另一种操作系统,比如在windows系统里运行Linux系统。应用程序对此毫无感知,因为虚拟机看上去就跟真实的系统一样,能够使应用程序,操作系统和硬件三者之间逻辑不变   虚拟机的缺点: 资源占用多 冗余步骤多启动慢 由于虚拟机存在这些缺点,Linux发展出了另一种虚拟化技术:Linux容器(LinuxContainers,缩写为LXC)。         Linux容器不是模拟一个完整的操作系统,而是对进程进程进行隔离。有了容器就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆包一整套操作系统,只需要软件工程所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一的工作。   比较了Docker和传统虚拟机方式的不同之处: 传统虚拟机技术是虚拟机出一套硬件后,在其上运行一个完整操作系统,在该系统上在运行所需应用进程; 而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。每个容器之间相互隔离,每个容器有自己的文件系统,容器之间进程不会互相影响,能区分计算字资源。   四、开发/运维(DevOps) 更快速的应用交付和部署 更便捷的升级和扩缩容 更简单的系统运维 更高效的计算资源利用   五、Docker安装 Docker支持一下的CentOS版本: CentOS 7(64-bit) CentOS 6.5(64-bit)或更高版本   目前,CentOS仅发行版中的内核支持Docker。 Docker运行在CentOS7上,系统内核版本为3.10以上 Docker运行在CentOS6.5或更高版本,系统内核版本为2.6.32-431或跟高的版本 使用uname命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)   六、Docker的基本组成   Docker镜像(image)就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建很多容器。 Docker容器(Container)独立运行的一个或一组应用。容器就是镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个建议的Linux环境和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上层那一层是可读可写的。 Docker仓库(Repository)是集中存放镜像文件的场所。仓库和仓库注册服务器是有区别的。仓库注册服务器上往往存放着很多个仓库,每一个仓库又包含了多个镜像,每个镜像有不同的的标签(tag)。仓库分为公开仓库和私有仓库两种形式。最大的公开仓库是DockerHub         Docker本身是一个容器运行载体或称之为管理引擎。我们把应用程序或配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎image镜像文件。只有通过这个镜像文件才能生成Docker容器。image文件可以看作是容器的模板。Docker根据image文件生成容器的实例。可以生成多个同时运行的容器实例。   七、安装Docker(CentOS7) 参考官网:https://docs.docker-cn.com/engine/installation/linux/docker-ce/centos/ 1.卸载旧版本(没有装过可以直接跳过) sudo yum remove docker     docker-common     docker-selinux     docker-engine2. 安装所需的软件包 sudo yum install -y yum-utils device-mapper-persistent-data lvm23.设置stable镜像仓库 sudo yum-config-manager     --add-repo     https://download.docker.com/linux/centos/docker-ce.repo4.启用edge和testing镜像仓库(可选) sudo yum-config-manager --enable docker-ce-edgesudo yum-config-manager --enable docker-ce-testing5.更新yml的软件索引 sudo yum makecache fast6.安装最新的DockerCE sudo yum install docker-ce7.启动Docker sudo systemctl start docker8.采用阿里云镜像加速(可选) 访问https://dev.aliyun.com/search.html 注册阿里云账号,并登陆 点击进入管理中心,找到镜像加速区 根据阿里云提示修改Docker配置 9.测试安装是否成功,运行HelloWord镜像 sudo docker run hello-world  运行成功! 10.Docker运行步骤    
Re: 《Linux 进程管理命令》   ---------------------------------------内容提要: 01/15)命令 ps         :查看进程(快照)02/15)命令 pstree   :显示进程状态树03/15)命令 pgrep   :查找匹配条件的进程04/15)命令 kill        :终止进程号(1277)05/15)命令 killall    :通过进程名(nginx)终止进程(父/子进程)06/15)命令 pkill      :通过进程名终止进程(通杀)/终止客户端(pst/tty)07/15)命令 top       :实时显示系统中各个进程的资源占用状况(录像)08/15)命令 nice      :调整程序运行时的优先级09/15)命令 renice   :调整运行中的进程的优先级10/15)命令 nohup  :用户退出系统,进程继续工作11/15)命令 strace   :跟踪进程的系统调用12/15)命令 ltrace    :跟踪进程调用库函数13/15)命令 runlevel:输出当前运行级别14/15)命令 init        :初始化 Linux 进程15/15)命令 service  :管理系统服务  本人在教学和实战过程中发现,即便是有一定运维经验的人,可能已经能够搭建一定复杂度的Linux架构,但是在来来回回的具体操作中,还是体现出CLI(命令界面)功底不够扎实,甚至操作的非常‘拙’、处处露‘怯’。 对一个士兵来说,枪就是他的武器,对于一个程序员来说,各种library(工具库)就是他的武器;而对于Linux运维人员来说,无疑命令行工具CLI(命令界面)就是他们的武器;高手和小白之间的差距往往就体现在对于这些“武器”的掌握和熟练程度上。有时候一个参数就能够解决的事情,小白们可能要写一个复杂的Shell脚本才能搞定,这就是对CLI(命令界面)没有理解参悟透彻导致。 研磨每一个命令就是擦拭手中的作战武器,平时不保养不理解,等到作战的时候,一定不能够将手中的武器发挥到最好,所以我们要平心、静气和专注,甘坐冷板凳一段时间,才能练就一身非凡的内功! 本教程从实战出发,结合当下流行或最新的Linux(v6/7/8 版本)同时演示,将命令行结合到解决企业实战问题中来,体现出教学注重实战的务实精神,希望从事或未来从事运维的同学,能够认真仔细的学完Linux核心命令的整套课程。 本课程系列将逐步推出,看看我教学的进度和您学习的步伐,孰占鳌头! 注:关于教学环境搭建,可以参考本人其它课程系列,本教学中就不再赘述! 《参透 VMware 桌面级虚拟化》 《在虚拟机中安装模版机(包括应用软件等)》 《SecureCRT 连接 GNS3/Linux 的安全精密工具》

5,402

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧