摘要:Delphi中DLL的创建和使用 1.DLL简介; 2.调用DLL; 3.创建DLL; 4.两个技巧; 5.初始化; 6.例外处理。 1、DLL简介 DLL是Dynamic-Link Libraries(动态链接库)的缩写,库里面是一些可执行的模块以及资源(如位图、图标等)。可以认为DLL和EXE基本上是一回事,只是DLL不能直接执行,而必须由应用程序或者其他DLL调用。DLL为应用程序间的资源共享提供了方便,同时也是多语言混合编程的重要手段。由此可见学习使用DLL是Windows程序员必须掌握的一项重要技术。 2、如何调用DLL 在Delphi中有两种方法调用DLL中的函数和过程,即...
阅读全文
摘要:delphi dispose释放内存的方法New和GetMem的区别定义一个record 类型,经过多次new dispose后,从windows任务管理器看,占用的内存比启动时大了很多,似乎越来越大设置 ReportMemoryLeaksOnShutdown := true; 再运行,仍然没有提示 memory leak。其实就是dispose 本身的原因。delphi设计的 dispose 释放内存时,只是标记这部分内存可以再用来被 new 等函数分配,并不是把从系统申请到的内存归还给操作系统,只在程序结束时,才全部释放给操作系统。比如 new 申请 15 个记录(sizeof=64字节)
阅读全文
摘要:delphi的取整函数round、trunc、ceil和floor 1.Round(四舍六入五留双) 功能说明:对一个实数进行四舍五入。(按照银行家算法) 例: vari, j: Integer; begini := Round(1.5); // i等于2 j := Round(2.5); // j等于2 end; 在Delphi中使用Round函数得到的答案有时与我们所预期的会不太一样:采用的是四舍六入五留双。即当舍或入位大于或小于五时按四舍五入来处理 ,而当舍或入位等于五时,就要看前面一位是什么,根据奇进偶不进,它总是返回一个偶数值。 例: i:= Round(11.5)//i等于12 i
阅读全文
摘要:摘要在 Microsoft Windows 平台上有几种以原子方式锁定代码和数据的不同方法。此白皮书的主要目的是向开发人员简要介绍 Windows 中进行锁定的不同方法以及与这些锁定有关的相应性能开销。因为未来架构将是多核架构,因此此信息非常适用。简介多线程软件应用对于提升英特尔内核架构的性能至关重要。锁定代码通常是多线程应用中运行最频繁的代码。确定要使用的锁定方法与确定应用中并行处理一样重要。此白皮书的主要目的是向开发人员简要介绍 Windows 中进行锁定的不同方法以及与这些锁定有关的相应性能开销。Window 的某些锁定 API 可能会跳转至操作系统内核。此白皮书将详细说明跳转至内核的
阅读全文
摘要:原型 function paramstr(i:index):string 对于任何application paramstr(0)都默认代表的是应用程序的绝对路径。那么有paramstr(0),就肯定 有paramstr(1),paramstr(2)...了。它们的值又是什么了?我试了下取出的是空值,又不能赋值。 delphi帮助中说Returns a specified parameter from the command-line.从命令行中返回一个特别的参数。 折腾了半天才搞清楚,就是在exe文件后面可以跟参数,paramstr 获取的就是exe文件后面跟参数。 如有可执行文件pro...
阅读全文
摘要:CoInitialize(LPVOID),它将以特定参数调用CoInitializeEx,为当前单元初始化COM库,并标记协同模式为单线程模式。参数必须为NULL。这是关于OLE和COM的问题。CoInitializeEx(LPVOID),新版本,可以用参数指定协同模式,如多线程模式,但注意单元的协同模式是不能改的,如果在已经初始化为多线程的单元里初始化OLE将失败并返回RPC_E_CHANGED_MODE。每个线程只要调用一次初始化就够了,同一线程中的后续调用也将通过,但会返回S_FALSE。后面解除初始化调用要与本调用一一对应,返回S_FALSE的CoInitialize调用也计算在内。应
阅读全文
摘要:procedure New(var P: Pointer); {为一个指针变量分配内存,会自动计算指针所指数据结构需要空的空间大小}procedure GetMem(var P: Pointer; Size: Integer); {分配一个指定大小的内存块(连续),并用P指向它}procedure ReallocMem(var P: Pointer; Size: Integer);{重新分配指定大小内存块,参数P必须是nil或者指向一个由GetMem, AllocMem, 或 ReallocMem分配的内存变量,其分配的内存是连续的,会把前面已有的数据移到新分配的内存中去}通常采用New分配内
阅读全文
摘要:View Code 1 unit uProgLog; 2 3 interface 4 5 uses 6 Windows, SysUtils, SyncObjs; 7 8 const 9 C_LOG_LEVEL_TRACE = $00000001; 10 C_LOG_LEVEL_WARNING = $00000002; 11 C_LOG_LEVEL_ERROR = $00000004; 12 type 13 EnumSeverity = (TraceLevel, WarningLevel, ErrorLevel, LogLevel); 14 15 functi...
阅读全文
摘要:模拟键盘我们用Keybd_event这个api函数,模拟鼠标按键用mouse_event函数.Keybd_event函数能触发一个按键事件,也就是会产生一个WM_KEYDOWN或WM_KEYUP消息,一般用这两个消息来模拟一次按键(按键的过程是:按下,然后弹起),但是没有直接用这个函数方便。Keybd_event共有四个参数:第一个为按键的虚拟键值,如回车键为vk_return, tab键为vk_tab;第二个参数为扫描码,一般不用设置,用0代替就行;第三个参数为选项标志,如果为keydown则置0即可,如果为keyup则设成“KEYEVENTF_KEYUP”;第四个参数一般也是置0即可。例如
阅读全文
摘要:(来自小李飞刀:http://vir.jxstnu.edu.cn/xieyunc/read.php?253)DLL部分:PIMAGE_IMPORT_DESCRIPTOR=^_IMAGE_IMPORT_DESCRIPTOR;PImageImportDescriptor=PIMAGE_IMPORT_DESCRIPTOR;_IMAGE_IMPORT_DESCRIPTOR=packedrecordCharacteristicsOrOriginalFirstThunk:DWord;TimeDateStamp:DWord;ForwarderChain:DWord;Name:DWord;FirstThunk
阅读全文
摘要:Delphi 可执行文件一般包括以下几个区段:CODE 程序代码DATA 初始化数据BSS 未初始化静态变量或全局变量.idata Import table。记录隐式连接的DLL函数.rdata 可能包含的数种数据,例如程序描述字符串,GUID等。.rsrc 各种资源,如字符串,图标,鼠标等.tls 执行线程私有变量.reloc 复位表格
阅读全文
摘要:问题:tagTVITEMA = packed record mask: UINT; hItem: HTreeItem; state: UINT; stateMask: UINT; pszText: PAnsiChar; cchTextMax: Integer; iImage: Integer; iSelectedImage: Integer; cChildren: Integer; lParam: LPARAM; end; 是不是与C中的struct相似??答案:Packed关键字是与编译有关的!!! 在默认情况下,Delphi编译器是对数据进行优化的!!! 例如: TX = Record A
阅读全文
摘要:Delphi作为一个优秀的开发工具,这不仅是由于它开创了“构件(Component)”时代,影响深远;另一个原因是它拥有非常出色的编译器,Borland(Inprise)公司宣称Delphi具有世界上最快的编译器,如果你使用过Visual C++和Delphi你会明显体会到这一点。Delphi快速高效的编译器主要来自Object Pascal的严谨,使用Delphi随时都在和编译器交流,大部份情况下不需要我们干涉编译器的运行,但是有时也需要对编译器进行必要的设置。作为Delphi的使用者,你是否真正了解Delphi的编译环境呢?*********************************
阅读全文
摘要:问题是你要全局的.还是要系统级的,还是要局部的。 如果是全局和局部的,那么在主窗体上(或其他控件上)(form)的KeyPress等属性上监控就行了.. 如果是系统级的,那么需要API了. 简单代码: 用到3个API函数 BOOL RegisterHotKey( HWND hWnd, //响应该热键的窗口句柄 Int id, //该热键的唯一标识 UINT fsModifiers, //该热键的辅助按键 UINT vk //该热键的键值 ); 为了得到唯一标识,我们还将用到另一个API函数 ATOM GlobalAddAtom( LPCTSTR lpString //自己设定的一个字符串 );
阅读全文
摘要:在网上行走时,经常会看到弹出的桌面小窗体,有时做广告,有时向你致以节日的问候;人们称其为桌面小精灵;有的桌面小精灵会自动移动,有的固定在屏幕的某一角落,动画闪烁,煞是迷人。本人用Delphi制作了一款桌面小精灵,愿与大家共享。 桌面小精灵的实现功能:当运行时,在屏幕的左下角显示一无边框、无标题栏的小窗体,并自动向屏幕的右上角移动,窗体上的小精灵——可爱的马先生,一会跃起,高呼“马 到成功!”,一会含情脉脉地向你招手“再见”;同时,还不断地闪烁显示当前时间,时刻提醒你抓紧时间呦!当你嫌它碍事时,你可以按下鼠标左键,将它拖到任意位置。如果你厌烦它不停移动,你可以双击鼠标左键,它会老老实实地呆在原.
阅读全文
摘要:CopyRect()原型:CopyRect(Dest: TRect; Canvas: TCanvas; Source: TRect)它将源画布某一矩形区域的图像复制到目标画布的矩形区域。由于是内存的成块复制,因此具有很高的执行效率。在Timer 组件的OnTimer 事件程序中灵活使用该函数,可以设计出各种美观演示效果:如百叶窗、推拉、马赛克、随机线、反像等等。其中:Dest:目标画布矩形Canvas:源画布Source:源矩形这是一个DELPHI内部的命令,它主要用于某些控件的画布操作,即CANVAS属性下支持的一个图像复制命令,其功能是把图像从一个源RECT内,复制到目标RECT内,复制的
阅读全文
摘要:在写画图软件必然少不了canvas,可是像我们这样的刚步入程序开发的人们,哪有都懂的,只做一点学一点了。下面是Canvas的相关属性。在Delphi中,专门定义了一组用于绘制图形的对象和组件,完成一些简单的图像功能。利用这些对象、组件的方法,可以方便地绘制各种常用图形;通过设置它们的属性,能得到不同风格的图形。另外,通过对鼠标事件的定义,可以方便设计图形绘制程序。(1)TCanvas,TPen,TBrush,TColor对象的方法及属性;(2)绘图功能的实现;(3)TImage,TPicture,TBitBtn,TBitmap组件的方法及属性;(4)图像观测及处理。4.4.1 TCanvas—
阅读全文
摘要:比如命令行:c:/temp/MyApp.exe \test \save 那么: ParamStr[0] = 'c:/temp/MyApp.exe' ParamStr[1] = '\test' ParamStr[2] = '\save' =============================================== 补充:这里只是举个例子,这些参数就是要你的程序实现的功能啊! 如果你的程序没有必要使用参数,这些参数也就没有意义了。 ParamStr的用处就是帮你把接收到的命令中的参数识别分离出来,好让你针对参数进行编程。ParamS
阅读全文
摘要:1.)方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。 如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。 如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。2.)Delphi 的函数覆盖(O..
阅读全文
摘要:本话题会涉及到: Lo、Hi、HiByte、LoWord、HiWord、MakeWord、MakeLong、Int64Rec譬如有一个 Cardinal 类型的整数: 1144201745其十六进制的表示是: $44332211其二进制表示是: 01000100 00110011 00100010 00010001我们说 Cardinal 是 32 位的整数, 这里的位是指 "二进制的位数", 不信你数数.我们需要重点面对的是十六进制, 不管是几进制的数在编译成汇编代码时都是用十六进制表示, 因为它最直观;我们用十六进制来分析, 也是因为它的直观.怎么直观的? Cardin
阅读全文