用过或者说热爱DEPHI的朋友们都遇到过这种情况: 得到一个非常非常酷的VCL元件,确只能在IDE开发环境下运行,一旦编译成EXE文件单独运行就不能用了,偶尔”良心”的也会在这时弹出一个对话框,要你花XX美元注册并购买这个元件(这正是我等痛恨的,有同感的请举手).假设我们开发了一个Authorware插件并想用它赚几个Money的话,就要学 这就要求我们的程序能够判别出用户使用插件时是在开发环境还是运行环境.通过获取当前,但在Authorware下行不通,我试过发现:Authorware在开发时的窗口 和打包以后单独运行的窗口的类名是相同的!其实在Authorware3.0以后Marcomedia公司就提供了一个结构型参数,可以通过这个参数来获取运行状态,该结构型参数原本是C++语言描述的,现在本人将它转化为Object Pascal型声明如下:
type
AWPARAM = record
size: Word; //该结构的长度
hwnd: HWND; //Authorware窗口的句柄
authoring: Bool;//是否处在开发状态,是返回true 否返回false
reserved1: LongInt;//保留
reserved2: LongInt;//保留
end {AWPARAM};
FAR = AWPARAM;
AWPARAM_PTR = ^AWPARAM //声明作为远指针调用
好了,将该参数结构描述加入工程文件(在uses语句之后),现在让我们使用这个参数来实现一个商业化的软件,还是以上面这个输入框函数为例,要求当用户在Athorware开发环境下使用时一切正常,当用户在打包
后生成的EXE文件中调用时弹出一个要求注册的模式对话框。
首先将上面函数改为:
……
function displayinputbox(winhandle: AWPARAM_PTR;aption,tiptxt,defaulttxt:Pchar):Thandle;stdcall;
……
begin //从此处插入以下代码
if winhandle.authoring=false then
messagebox(winhandle.hwnd,’这是一个未注册的Authorware插件’,’请注册’,MB_OK);
……
可是,现在的问题是:如果用户不调用AWPARAM 这个参数,岂不是会出错?
其实,Marcomedia公司早就想到了这一点。该参数只提供给程序员使用,对于用户而言,该参数
是隐藏的,不透明的,是一个“虚拟参数”也就是用户在使用这个函数时根本就不加入这个参数,而是由Authorware自行加入,就好像这个参数根本就不存在.
为了让Authorware识别这个参数,在字符串资源文件中需要作如下修改:
……
"ASSS\0",(第一个“A”表示要求Authorware传递一个AWPRRAM参数,切记!)
……
现在你可以坐在家里等收钱吧