GZ, DELPHI中也要用指针参数。
解决方案 »
- QQ珊瑚虫版的安装文件是什么软件打包的
- 关于建立ado之后的信息显示问题!!
- 如何在程序中取得系统设定的首选DNS和备选DNS地址
- 谁用过SUIPack这个控件
- 自做导航条
- 如何更改exe文件的图标?
- 请教:使用Delphi下载DB2数据库中的BLOb字段内容
- 请教:DELPHI如何将数据导出到指定格式的EXCEL模版?
- 我发现了delphi5的一个bug!
- 这样的问题怎么解决???
- 我执行Query1.append时出现Query1:cannot modify a read-only dataset,但我的RequestLive已设为True,请问是怎么回事?解决之后一定80分相
- delphi 5 ado 不打补钉会出现什么问题
private
{ Private declarations }
procedure kk(k,l:string);overload;
procedure kk(k:integer);overload;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure tform1.kk(k,l:string);
begin
showmessage(k+l);
end;procedure tform1.kk(k:integer);
begin
showmessage(inttostr(k));
end;procedure TForm1.Button1Click(Sender: TObject);
begin
kk('hello','hey');
end;procedure TForm1.Button2Click(Sender: TObject);
begin
kk(9);
end;
private
{ Private declarations }
procedure kk(k,l:string);overload;
procedure kk(k:integer);overload;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure tform1.kk(k,l:string);
begin
showmessage(k+l);
end;procedure tform1.kk(k:integer);
begin
showmessage(inttostr(k));
end;procedure TForm1.Button1Click(Sender: TObject);
begin
kk('hello','hey');
end;procedure TForm1.Button2Click(Sender: TObject);
begin
kk(9);
end;
procedure f(m: array of const);
No.2 变体类型
procedure f(m: Variant);
No.3 无类型参数
procedure f(const m);
1.override
2.開放數組//常量數組
3﹑回調函數
4.指針
以后只要调用一个,MyDoAll,就可以实现所有的功能,呵呵,开个玩笑,能否说明白一点?
我以前是用TURBO C
不是VC,那是C,不是C++,什么重载,只有宏
不是问关于参数的设计
而是就有这么一个函数,
function myfunc():integer
在一个DLL中
主EXE中让他要这个样子
myfunc(1,3)
当然,在用之前 当然可以知道后面要加int,int了,
但在EXE形成前不知道, LXJ2001(lxj) 说的有点那个意思
就要这种效果!
但只有一个,
而EXE中可能要有几个形式的函数形式,
要DLL里的那个函数统统处理,假设有运行前,INI里有EXE要用的函数形式,DLL里又怎么写
反正INI是可以改的,
总不能改一次INI,就把DLL,和EXE都改了吧,大家明白我的意思了么??写得有点乱,没关系,慢慢谈,总会谈明白的
但后期 我的DLL文件要加几个函数,当然我得写一个INI式的说明,
加的函数是什么样的,如int myfunc(int,int)
或function myfunc(integer,integer):integer
但这是后期加的,
而我的EXE要对里面的函数动态地产生菜单
点菜单就能使用后期改了之后的DLL里的函数,如做一个报表,等等,
反正你爱怎么写就怎么写,
我的前期EXE要求不变,
也就是说,我的EXE里的调DLL函数的函数指针形式不能变,
又要能调用不同的函数,嘿嘿,这回写的是不是有点明白呢,
TMyFunc = function(Param1: Integer; Param2: PChar): DWORD; stdcall;var
hDLL: THandle = 0;
MyFunc: TMyFunc;function LoadFunc: Boolean;
const
DLLName = 'mydll.dll';
FuncName = 'MyFuncName';
begin
Result := hDLL > HINSTANCE_ERROR;
if Result then Exit;
hDLL := LoadLibrary(DLLName);
Result := hDLL > HINSTANCE_ERROR;
if Result then
MyFunc := GetProcAddress(hDLL, FuncName);
end;procedure FreeDLL;
begin
if hDLL > HINSTANCE_ERROR then
begin
MyFunc := nil;
FreeLibrary(hDLL);
end;
hDLL := 0;
end;
如果多了一个参数,难到EXE中不用多准备一个参数吗。
DLL中肯定要改的,不然你怎么实现多加的函数了?
这就是一个一般的EXE动态LOAD 一个DLL的过程,
而且还得要EXE中函数原形,和DLL中的的形式一样呢,不是么,和我的要求一点也不相干呀,
to LXJ2001(lxj)
当然可以,
EXE可以完全不改,而DLL么,
要是EXE真能做到这一点,那么,EXE找到一个固定的目录,找里面的DLL文件,做为插件,然后用里面的函数,不是一样么,
只是由改DLL变为加了一个DLL而已呀上面的思想要是不可能的话,那么,MP3,photoshop....
怎么都能做收后期加入插件呢,
DELPHI本身的这种插件式思想就更好了,
为什么我们的程序做不到这一点甚至我们可以把条件再紧一点,
如DLL只能返回integer 和string
不能用数组,只能用integer,string,double,的有限多个,
因为这样,这个程序也已经很灵活了,不是么?
你在EXE中有这个一个函数原形
function myfunc(integer,integer):integer;
而在DLL
你只是有
procedure myfuc1()
{
showmessage('hello world')
}EXE竟能把DLL中这个函数调出来,并执行,!我想这是一种功能,不会是DELPHI的那个那个BUG吧,
请后面的朋友看这样一种情况:
我想是题意思不太明白,你们看这个会清楚一些
我前期写好了一个EXE文件,要动态LOAD DLL的,
我把DLL做成EXE的许多插件,如计算类,报表类,
就举这么一个例子吧,会计里面的有些数据算法就是要变的,
而参数也可能变了,
我有INI可以反应这种变化
但程序已经发出去,并不能改动
我要在一个目录下改一个DLL中的这个函数
而返回值和参数可以变化
而我的前期EXE也能正解把结果显示出来,
是String的显示串,是数据的也变成inttostr()显示出来,
也就是说,我的EXE里的调DLL函数的函数指针形式不能变,
又要能调用不同的函数,嘿嘿,这回写的是不是有点明白呢,
请后面的朋友看这样一种情况:
我想是题意思不太明白,你们看这个会清楚一些
我前期写好了一个EXE文件,要动态LOAD DLL的,
我把DLL做成EXE的许多插件,如计算类,报表类,
就举这么一个例子吧,会计里面的有些数据算法就是要变的,
而参数也可能变了,
我有INI可以反应这种变化
但程序已经发出去,并不能改动
我要在一个目录下改一个DLL中的这个函数
而返回值和参数可以变化
而我的前期EXE也能正解把结果显示出来,
是String的显示串,是数据的也变成inttostr()显示出来,
也就是说,我的EXE里的调DLL函数的函数指针形式不能变,
又要能调用不同的函数,嘿嘿,这回写的是不是有点明白呢
****************
procedure DefValue(S:string;I:integer = 0);调用
DefValue('Hello');
Defvalue('Hello',3);
类似接口,一旦想改变函数名称,参数类型,个数,必须另外创建一个不同名称的函数Export并出去。
类似接口,一旦想改变函数名称,参数类型,个数,必须另外创建一个不同名称的函数Export并出去。
是呀,
DLL是要这么做,
但你的EXE可以做得更绝!
从一个文件中得知改了的函数名的参数
用一个一般的函数指什指向它,
在里面再读文件,知道后面是什么参数,然后对参数进行处理,
返回值,是串,返回串,
是数也转成串嘛
当然不是,你那种不是正常情况么,
而我说的不是,
DLL里的参数比EXE的少,而不是多,但还能用,
这和书上写的已经不一样了,
function FunName(var Value):integer
再去取地址啊,移动指针什么的!!!!!!!
每次发布时发布两个DLL
不行,那就等于,把程序做成两块,那一块专门 用于修改,
不是我的意思>: steel1991(※随想曲※)
你要是这么喜欢分,我可以开一个灌水的贴(我的可用分好几千)>badsky(badsky)
用不用那些不是关键,但那些也解决不了问题,
还不如ZSwang的办法好呢,用Variant>victorchen_2000(微力) (
说详细一点,好不?
procedure RunDllFunc;
asm
// 自己根据配置处理参数栈
// ... ... // 取到Dll中函数的地址
// 把参数压栈
// Call [函数]
// 取出参数返回值 // ... ...
end;这样你的问题不就解决了?
procedure f(m: array of const);
No.2 变体类型
procedure f(m: Variant);
No.3 无类型参数
procedure f(const m);你用 procedure f(m: array of Variant);试试
procedure f(m: array of const);
No.2 变体类型
procedure f(m: Variant);
No.3 无类型参数
procedure f(const m);你用 procedure f(m: array of Variant);试试
我在DLL里这样写
function myfunc(a:integer;b:string;c:double):integer;stdcall;
我在EXE里
你们说我怎么写吧,
fubction * mm(variant):integer;
是么
那我loadlibrary 成功后,
GetProcAddress???
我怎么用DLL的这个家伙??
我也只能指向它呀,
再就调用它了,
我在什么时候把VAriant 分成
m_var : variant;
integer(m_var[0])
....
..
这些我使不上劲呀再UP
// 做一个处理函数,只能用汇编写
procedure RunDllFunc;
asm
// 自己根据配置处理参数栈
// ... ... // 取到Dll中函数的地址
//这个好象没问题GetProcAddress
// 把参数压栈,???,这要怎么做,
// Call [函数]
// 取出参数返回值 // ... ...
end;这样你的问题不就解决了? 我对汇编不是很熟,是很不熟,望指点,
类,COM的COM+的你想用什么用什么,千万别说这个功能不能实现,
因为我手上就有这么一个东东
(如有思路的高手,我可以发一个例子,(用这个东东做一下)
因为它能解释脚本,
并最最最可怕的是,它的脚本里可以用你自己的函数)
1.只要你写了DLL(一般的STDCALL)
2.并写一个函数说明的INF文件,
3.并在一个INI中指定这个文件,
因为这是必须这是一个不太大的程序,也很老,工具条都不能动,
不不不,是工具条都没有,上面只是几个BUTTON而已
但就这个功能一下子让我惊讶了。
太可怕了。
http://vip.6to23.com/zgj67/他现在的版本可能有点问题,但你去论坛看看,和它的说明
你写的DLL,它就能运行!