大悟还俗

邮箱 key_ok@qq.com 我的收集 http://pan.baidu.com/share/home?uk=1177427271
  新随笔  :: 联系 :: 订阅 订阅  :: 管理

随笔分类 -  Delphi

上一页 1 ··· 3 4 5 6 7 8 下一页

摘要:调用DLL中的函数可分为早绑定与晚绑定!早绑定是指在编译期就已经确定函数地址!晚绑定是指在运行期动态加载dll,并根据查表的方式获取dll内exports函数的地址,由于早绑定比较简单,在此不再讲述,主要说晚绑定!//晚绑定,也就是动态调用外部函数主要用以下三个命令: //LoadLibrary:获取 DLL //GetProcAddress:获取函数 //FreeLibrary:释放DLL例:type TFunctionName=function():boolean;stdcall;//定义函数类型 Function DynamicInvokeDllFunction: string; ... 阅读全文

posted @ 2013-10-09 12:13 大悟还俗_2 阅读(380) 评论(0) 推荐(0)

摘要:问题描述:具体问题就是在隐式使用接口变量后,在FreeLibrary执行后,就会出现一个非法访址的错误。这个错误的原因就是在FreeLibrary后,DLL以的代码均为不可用状态,而在代码执行完整个过程后,VCL要对RTL类型的数据进行清理。而在清理过程中肯定要对接口进行减1并进行释放相关对象。而对象代码已从进程空间卸载,故报非法访址错误!解决方法:所以要想解决该问题,就应该把DLL调用过程放到一个单独的过程中,其目的就是让调用完毕后,让VCL来清理接口。清理完毕后返回后,再调用FreeLibrary来从进程空间中卸载DLL。错误调用代码为:var libHandle: THandle; .. 阅读全文

posted @ 2013-10-09 12:12 大悟还俗_2 阅读(837) 评论(0) 推荐(0)

摘要:Delphi创建DLL时,IDE自动生成的文档中写得很清楚,当在DLL中以动态数组或String做为参数或返回值时(即RTL自动维护的数据类型),请在每个工程文件的第一个单元加上ShareMem。这样就可以使宿主程序与DLL共享内存管理器了!这样的话,在发布程序时需要把borlndmm.DLL一同发布!问题1:为何要加到工程文件的第一个单元? 对于DLL和主程序这样的程序结构来说,使用2个内存管理器,在返回的数据类型为string的话,仅仅在主程序中将内存管理器中将引用数加1,而DLL的引用数不变,这样当退出DLL过程中,由于引用数为0,要对返回值进行释放,由于主程序中的数据为一个地址,将DL 阅读全文

posted @ 2013-10-09 12:12 大悟还俗_2 阅读(320) 评论(0) 推荐(0)

摘要:相关背景:我们在做桌面级小程序时,一般的结构是:设计业务对象做工作线程写界面工作线程主要把业务对象给封装起来,处理时避免前台界面停止响应的情况。但有时业务对象会有异常,需要反应到前台界面上,这时,我们需要捕获一下线程的异常type TTrdExceptionDemo=class(TThread) private FException: Exception; procedure DoHandleException; protected procedure Execute; override; procedure HandleException; virtual... 阅读全文

posted @ 2013-10-09 12:06 大悟还俗_2 阅读(280) 评论(0) 推荐(0)

摘要:在Delphi中,Inifiles单元中有一个TStringHash的类,不过它的Value仅支持Integer(其实也不是问题,有其它类型可以将变量变为Pointer),有点不舒服,今天没事做就把它替换为variant了,其中Key的名称大小写无关,就是为了加快开发速度!使用Hashtable,查找和删除复杂度都是常数级别的!type PPHashItem = ^PHashItem; PHashItem = ^THashItem; THashItem = record Next: PHashItem; Key: String; Value: Variant; end... 阅读全文

posted @ 2013-10-09 12:05 大悟还俗_2 阅读(869) 评论(0) 推荐(0)

摘要:平时写程序时经常要把一些Key与Value保存起来,但一般数据量都不大,故不想用TStringHash来做。而用TStringList来做,还要写一个"=",挺别扭!而且数据类型还有限制。自己从VCL中找了一段,感觉挺好用的,以后用它玩一玩!不过对Key值的搜索采用遍历方式,数据量大就慢了,建议采用HashTable。注:Key与Value均不受数据类型限制!TLookupList = class(TObject) private FList: TList; public constructor Create; destructor Destroy; override; . 阅读全文

posted @ 2013-10-09 12:02 大悟还俗_2 阅读(329) 评论(0) 推荐(0)

摘要://GetLastInputInfo是检测系统输入的,应用到某个程序中不合适!此问题有二种解法来监控输入消息:1.用线程级HOOK,钩上MOUSEHOOK与KEYBOARDHOOK2.在Application.OnMessage中做处理显然,用第2种方法比较方便!众所周知,键盘与鼠标消息都是队列消息,需要经过消息队列后经过一些处理,再发往各个WNDPROC。基于这个原理,我们可以在ONMESSAGE中做一下消息处理,即先声明全局变量,用于保存上次输入动作的时间,而后用时间控件来进行定时扫描,用GetTickCount来判断是否超时。unit Unit1;interfaceuses Windo. 阅读全文

posted @ 2013-10-09 12:00 大悟还俗_2 阅读(279) 评论(0) 推荐(0)

摘要:unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, DB, ADODB;type PNodeInfoEx = ^TNodeInfoEx; TNodeInfoEx = Packed Record NodeID : Integer; ParentID : Integer; NodeType : Integer; ChnNodeTitle ... 阅读全文

posted @ 2013-10-09 11:59 大悟还俗_2 阅读(310) 评论(0) 推荐(0)

摘要://unit UntService;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, DB, ADODB,Registry,ActiveX;type TService2 = class(TService) con1: TADOConnection; procedure ServiceExecute(Sender: TService); procedure ServiceAfterInstall(Sender: TService); pro... 阅读全文

posted @ 2013-10-09 11:58 大悟还俗_2 阅读(454) 评论(0) 推荐(0)

摘要:需求:由于某种原因,需要根据管理员设定的时间定时关闭服务器上的COM+程序以及Windows Service程序。任务:任务就是做一个Windows Service,这个Service要有一个配置窗体(该窗体可通过HotKey呼出窗体或在服务启动时把配置窗体放到系统托盘中),用于管理员配置所要关闭的服务条目以及关闭时间。关键点:1.要设置允许服务与桌面进行交互2.定时(不想用Timer)3.关闭相关程序定时功能刚才调试了一下,已经实现!实现的方法就是在服务中创建一个线程,以管理员设置的Interval做为阻塞时间步骤1:先创建线程uses Classes,SyncObjs,Dialogs,S. 阅读全文

posted @ 2013-10-09 11:55 大悟还俗_2 阅读(291) 评论(0) 推荐(0)

摘要://第1种方法procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);begin if ActiveControl = ComboBox1 then Handled := True;end;//第2种方法(了解该方法后,以后会有助于我们处理更复杂的问题)unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Cl... 阅读全文

posted @ 2013-10-09 11:54 大悟还俗_2 阅读(858) 评论(0) 推荐(0)

摘要:这种模式如果不用面向对象的思想的话,也就是case Type of 1:doCreditCardPayment(); 2:doCheckPayment()end;然后在doCreditCardPayment中复制一段其它支付方式的代码拷到这个过程中,就搞定了!但以后如果需要新增加一种付款方式的话,您必须要打开程序,添加某过程,编译。然后进行整体业务流程的测试。往往程序员在修改主系统时会很头痛的,说不定改了哪部分会导致整体程序出问题。基于上述原因,我们在想,能不能在不修改主系统的前提下加上这个功能?我们一般是这样做:1.先在主系统做一个基类,类似于下述的TPayment,把付款业务的共同代码出来 阅读全文

posted @ 2013-10-09 11:53 大悟还俗_2 阅读(281) 评论(0) 推荐(0)

摘要:要想跨进程访问DBGRID,貌似只能用HOOK,写一个DLL想办法注入到目标进程。注入成功后,使DLL与目标进程在同一进程空间中(其内有一些细节问题,请参见代码),这时可以访问目标进程的VCL组件。并把VCL组件的数据通过进程通信的方式发给Sniffer进程。如何进行注入? 可以安装一个WH_CALLWNDPROC钩子,这样当有消息在窗口函数中时,系统就会装载HOOK,即执行DLL部分。如何发消息? 可以在DLL中设置一个自定义消息,在安装完钩子后,发送一个自定义消息至目标进程的窗口函数。以下实例可读出另一进程的EDIT、LABEL、DBGRID等控件的值。如何了解这个原理,跨进程读取Stri 阅读全文

posted @ 2013-10-09 11:49 大悟还俗_2 阅读(1017) 评论(1) 推荐(0)

摘要:1.利用SQL的Exec()来计算2.利用JavaScript来计算3.利用逆波兰式来计算(比较复杂)这里用JavaScript来实现uses ComObj;function TForm1.DoCaculate(exp: string): string;var script: Variant;begin script := CreateOleObject('ScriptControl'); script.Language := 'JavaScript'; Result := script.Eval(Exp);end;procedure TForm1.btn1Cl 阅读全文

posted @ 2013-10-09 11:40 大悟还俗_2 阅读(276) 评论(0) 推荐(0)

摘要://以下代码是错误的!!!//这一节主要告诉大家,以这种方式进行开发dll是不对的以及错误原因,正确的方式是什么!//DLL内创建对象,并把对象返回function GetDataSet(str,conn:PChar): TADODataSet;stdcall; begin Result:=TADODataSet.Create(nil); Result.Close; Result.ConnectionString:=conn; Result.CommandText:= str; try Result.Open; except on E:Excepti... 阅读全文

posted @ 2013-10-09 11:39 大悟还俗_2 阅读(320) 评论(0) 推荐(0)

摘要:function ExecShowModal(APath: PChar; ACmdShow: Integer; ATimeout: Longword): Integer;var vStartupInfo: TStartupInfo; vProcessInfo: TProcessInformation;begin FillChar(vStartupInfo, SizeOf(TStartupInfo), 0); with vStartupInfo do begin cb := SizeOf(TStartupInfo); dwFlags := STARTF_USESHOWWIN... 阅读全文

posted @ 2013-10-09 11:35 大悟还俗_2 阅读(378) 评论(0) 推荐(0)

摘要:【容器+结构体】注意事项1//这里的List是一种容器,是一种泛指,可以是List、StringList、ThreadList、ObjectList等!//现以List为例做一个例子!unit StudentExample;interfaceuses Classes,SysUtils,Dialogs;type //定义结构体及其指针,定义指针目的在于把指针放到List容器中 PStudent = ^TStudent; TStudent = packed record Name: PChar;//这里以指针数据为例(简单数据类型太简单,没什么可注意的) Age: Intege... 阅读全文

posted @ 2013-10-09 11:28 大悟还俗_2 阅读(434) 评论(0) 推荐(0)

摘要:RTTI需要引用单元TypeInfoGetPropInfo 函数用于获得属性的 RTTI 指针 PPropInfo。它有四种重载形式,后面三种重载的实现都是调用第一种形式。AKinds 参数用于限制属性的类型,如果得到的 PPropInfo 不属于指定的类型,则返回 nil。function GetPropInfo(TypeInfo: PTypeInfo; const PropName: string): PPropInfo;function GetPropInfo(Instance: TObject; const PropName: string;AKinds: TTypeKinds = [ 阅读全文

posted @ 2013-10-09 11:23 大悟还俗_2 阅读(339) 评论(0) 推荐(0)

摘要://想实现在函数中生成Memo1的内容,而后赋给Memo.Lines//方法1:var s: TStrings;begin s := TStringList.Create; AddMemoData(s); Memo1.Lines := s; //进行对象复制,而不是简单的指针赋值{procedure TCustomMemo.SetLines(Value: TStrings);begin FLines.Assign(Value);//进行对象的深度复制end;} s.Free; //释放TStringsend;//方法2var s:TStrings;//全局function A... 阅读全文

posted @ 2013-10-09 11:22 大悟还俗_2 阅读(415) 评论(0) 推荐(0)

摘要://该例程为在系统级屏蔽一些系统键、如WIN、TAB、CAP、POWER、SLEEP、HOME等!//屏蔽组合键下面例程不适用!(比如CTRL+ESC需要在钩子函数中用(p.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000) 0)进行判断,也不难,这里只是举个简单的例子)unit KeyBlocker;interfaceuses SysUtils, Classes, Windows, Messages;const WH_KEYBOARD_LL = 13;type PKBDLLHOOKSTRUCT = ^KBDLLHO... 阅读全文

posted @ 2013-10-09 11:20 大悟还俗_2 阅读(640) 评论(0) 推荐(0)

上一页 1 ··· 3 4 5 6 7 8 下一页