如何让代码在包含到DLL中执行与包含到EXE中执行做不同的处理? ( 积分: 100 )

  • 主题发起人 主题发起人 HongYuan
  • 开始时间 开始时间
H

HongYuan

Unregistered / Unconfirmed
GUEST, unregistred user!
比如:<br>单元unit&nbsp;SafeguardModule;中有代码<br><br>initialization<br>&nbsp;&nbsp;ModuleInfoManager.RegisterModule('保护',&nbsp;TfrmSafeguardModule);<br>end.<br>我想实现单元SafeguardModule包含在DLL时不执行这行代码,只有在包含在EXE中执行。
 
哦,可不可以这样啊,也不知道有没其他方法!<br>&nbsp;&nbsp;{$DEFINE&nbsp;A}//在&nbsp;SafeguardModule;中写上<br>编译dll的时候:&nbsp;//{$DEFINE&nbsp;A}<br>&nbsp;&nbsp;{$IFDEF&nbsp;A}<br>&nbsp;&nbsp;&nbsp;&nbsp;initialization<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ModuleInfoManager.RegisterModule('保护',&nbsp;TfrmSafeguardModule);<br>&nbsp;&nbsp;{$ENDIF}
 
to:Dstorm<br>这个办法对一个单元还行,要是多个单元,就很麻烦了。
 
另:<br>{$IFDEF&nbsp;MSWINDOWS}<br><br>这个定义在什么地方?我没找到呢
 
在每个单元前<br>{$INCLUDE&nbsp;Define.inc}<br>然后在Define.inc中定义<br>{$DEFINE&nbsp;USEDLL}
 
{$IFDEF&nbsp;MSWINDOWS}<br>&nbsp;&nbsp;{$ENDIF}
 
哈哈,<br>procedure&nbsp;CheckRun;<br>begin<br>&nbsp;if&nbsp;not&nbsp;IsLibrary&nbsp;then<br>&nbsp;begin<br>&nbsp;&nbsp;&nbsp;ModuleInfoManager.RegisterModule('保护',&nbsp;TfrmSafeguardModule);<br>end;<br>end;<br><br>initialization<br>CheckRun;<br>end.
 
IsLibrary:&nbsp;Boolean;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;True&nbsp;if&nbsp;module&nbsp;is&nbsp;a&nbsp;DLL&nbsp;}<br><br>怎么是个全局变量?
 
请问这个值,它是怎么得么的呢?
 
procedure&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_StartLib(Context:&nbsp;PInitContext;&nbsp;Module:&nbsp;PLibModule;&nbsp;DLLProc:&nbsp;TDLLProcEx);<br>var<br>&nbsp;&nbsp;TempSwap:&nbsp;TInitContext;<br>begin<br>&nbsp;&nbsp;//&nbsp;Context's&nbsp;register&nbsp;save&nbsp;fields&nbsp;are&nbsp;already&nbsp;initialized.<br>&nbsp;&nbsp;//&nbsp;Save&nbsp;the&nbsp;current&nbsp;InitContext&nbsp;and&nbsp;activate&nbsp;the&nbsp;new&nbsp;Context&nbsp;by&nbsp;swapping&nbsp;them<br>&nbsp;&nbsp;TempSwap&nbsp;:=&nbsp;InitContext;<br>&nbsp;&nbsp;InitContext&nbsp;:=&nbsp;PInitContext(Context)^;<br>&nbsp;&nbsp;PInitContext(Context)^&nbsp;:=&nbsp;TempSwap;<br><br>&nbsp;&nbsp;InitContext.Module&nbsp;:=&nbsp;Module;<br>&nbsp;&nbsp;InitContext.OuterContext&nbsp;:=&nbsp;Context;<br><br>&nbsp;&nbsp;//&nbsp;DLLInitState&nbsp;is&nbsp;initialized&nbsp;by&nbsp;SysInit&nbsp;to&nbsp;0&nbsp;for&nbsp;shutdown,&nbsp;1&nbsp;for&nbsp;startup<br>&nbsp;&nbsp;//&nbsp;Inc&nbsp;DLLInitState&nbsp;to&nbsp;distinguish&nbsp;from&nbsp;package&nbsp;init:<br>&nbsp;&nbsp;//&nbsp;0&nbsp;for&nbsp;package,&nbsp;1&nbsp;for&nbsp;DLL&nbsp;shutdown,&nbsp;2&nbsp;for&nbsp;DLL&nbsp;startup<br><br>&nbsp;&nbsp;Inc(InitContext.DLLInitState);<br><br>&nbsp;&nbsp;if&nbsp;InitContext.DLLInitState&nbsp;=&nbsp;1&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;InitContext.InitTable&nbsp;:=&nbsp;Module.InitTable;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Assigned(InitContext.InitTable)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitContext.InitCount&nbsp;:=&nbsp;InitContext.InitTable.UnitCount&nbsp;&nbsp;//&nbsp;shutdown<br>&nbsp;&nbsp;end<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;Module.InitTable&nbsp;:=&nbsp;InitContext.InitTable;&nbsp;&nbsp;//&nbsp;save&nbsp;for&nbsp;shutdown<br>&nbsp;&nbsp;&nbsp;&nbsp;InitContext.InitCount&nbsp;:=&nbsp;0;&nbsp;&nbsp;//&nbsp;startup<br>&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;if&nbsp;Assigned(DLLProc)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;DLLProc(InitContext.DLLInitState-1,0);<br><br>&nbsp;&nbsp;if&nbsp;MainInstance&nbsp;=&nbsp;0&nbsp;then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;Set&nbsp;IsLibrary&nbsp;if&nbsp;there&nbsp;was&nbsp;no&nbsp;exe&nbsp;yet&nbsp;}<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;IsLibrary&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;Default8087CW&nbsp;:=&nbsp;Get8087CW;<br>&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;if&nbsp;InitContext.DLLInitState&nbsp;=&nbsp;1&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;_Halt0<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;InitUnits;<br>end;<br>{$ENDIF}
 
{$IFDEF&nbsp;LINUX}<br>procedure&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_StartExe(InitTable:&nbsp;PackageInfo;&nbsp;Module:&nbsp;PLibModule;&nbsp;Argc:&nbsp;Integer;&nbsp;Argv:&nbsp;Pointer);<br>begin<br>&nbsp;&nbsp;ArgCount&nbsp;:=&nbsp;Argc;<br>&nbsp;&nbsp;ArgValues&nbsp;:=&nbsp;Argv;<br>{$ENDIF}<br>{$IFDEF&nbsp;MSWINDOWS}<br>procedure&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_StartExe(InitTable:&nbsp;PackageInfo;&nbsp;Module:&nbsp;PLibModule);<br>begin<br>&nbsp;&nbsp;RaiseExceptionProc&nbsp;:=&nbsp;@RaiseException;<br>&nbsp;&nbsp;RTLUnwindProc&nbsp;:=&nbsp;@RTLUnwind;<br>{$ENDIF}<br>&nbsp;&nbsp;InitContext.InitTable&nbsp;:=&nbsp;InitTable;<br>&nbsp;&nbsp;InitContext.InitCount&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;InitContext.Module&nbsp;:=&nbsp;Module;<br>&nbsp;&nbsp;MainInstance&nbsp;:=&nbsp;Module.Instance;<br>{$IFNDEF&nbsp;PC_MAPPED_EXCEPTIONS}<br>&nbsp;&nbsp;SetExceptionHandler;<br>{$ENDIF}<br>&nbsp;&nbsp;IsLibrary&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;InitUnits;<br>end;
 
true&nbsp;是dll,System单元的,其实system好多我都可以直接用的,什么ParamCount等等
 
这两个函数也不知道那里调用到
 
嗯,谢谢Dstorm的热情帮助,两种方法都可以行得通。
 
接受答案了.
 
我最后的代码:<br>&nbsp;&nbsp;{$IFDEF&nbsp;ShowStateModule}<br>&nbsp;&nbsp;if&nbsp;IsLibrary&nbsp;&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;ModuleInfoManager.RegisterModule('状态',&nbsp;TfrmStateModule);<br>&nbsp;&nbsp;{$ENDIF}
 
这样可以更自由。
 
后退
顶部