iCAx开思工具箱
标题:
能否在入口函数增加参数?
[打印本页]
作者:
boliang99
时间:
2005-9-14 11:15
标题:
能否在入口函数增加参数?
能在ug 二次开发的入口函数加入一些参数,就能在调用动态库函数时利用实参驱动一些功能。如
//#ifdef DISPLAY_FROM_USER_EXIT
extern void ufusr (char *param, int *retcode, int rlen
,tyoe
)
{
。。。
}
当然,这样简单的加上去是还行的,各位有什么好办法吗?
作者:
pzytony
时间:
2005-9-17 22:00
我认为没有意义
作者:
boliang99
时间:
2005-9-24 14:31
不大明白版主的意思。比如说,一个带UG入口函数的动态库中包含3个选择,假定选择的判定是依据 int type这个参数。我想在调用动态库的时候给type赋值以便动态库判断执行相应代码,而我又不想拆分动态库。大家说如何解决好呢?
作者:
深夜摔键盘
时间:
2005-9-24 15:39
你的DLL是自己调用的吗?如果那样的话,可以加参数。UG的入口,仅是DLL一个普通的输出函数。
作者:
boliang99
时间:
2005-9-24 16:52
谢谢!我用下面的方法调用为什么不行叫呢?
if (curtext=="加载产品")
{
char file_name[]= "E:\\myug\\h\\Debug\\h.dll" ;
FreeLibrary(hpart);
hpart=NULL;
char a;
int b,c;
typedef void (WINAPI * LIBDLL)(char, int ,int,int );
//h.dll的定义:extern void ufusr (char *param, int *retcode, int rlen,int a)
hpart = :
oadLibrary (file_name);
CString test;
test.Format("找不到\"%s\"模块!",curtext);
if(hpart==NULL)
{
AfxMessageBox(test);
return;
}
LIBDLL lpproc;
lpproc = (LIBDLL)GetProcAddress (hpart,"ufusr");
lpproc(a,b,c,1);
}
}
出错提示如附图
作者:
boliang99
时间:
2005-9-24 17:35
不好意思,图传 不上来。出错的大概意思是调用协定不同造成吧!
可能是因为我一直没理解好动态库调用协议的问题吧。我一直觉得有问题,USTYLER生成的template.c文件中,回调函数应该是按__cdecl协议,但入口函数怎么输出呢?好象并没有定义,但为什么UG又可以入口函数又可以被调用呢?----调用 时应该怎么定义调用指针?各位多多指教,谢谢
作者:
深夜摔键盘
时间:
2005-9-24 18:42
你的函数指针,参数不对啊,源程序就那样吗?
关于入口函数的输出问题,以前我有过一点讨论, ufusr肯定是输出函数,这个没有担心的必要。我的看法如下:
略为分析一下为什么ufusr,ufsta这样的user exit,在用户DLL中作为程序入口点时,不需要__declspec(dllexport)或者def文件来声明,但生成的DLL依然能够成为输出函数的原因。
动手试一下就知道了,以前没大注意这个,这也算是一种程序技巧。我测试是能通过的,但不知道UG是不是这么搞的。
1.建一个DLL工程,在.c或.cpp文件中声明一个函数,譬如在A.cpp中,
__declspec(dllexport) void fun(void);
2.然后在头文件A.h中添加如下代码:
extern __declspec(dllexport) void fun(void);
3.编译连接后,生成动态连接库A.dll
这样,假如fun函数就看作是我们的ufusr。然后我们做二次开发,建一个DLL工程B吧,
1.在B.cpp中,#include "A.h"
2.实现函数fun,譬如:
void fun(void)
{
printf("hello world\n");
}
3.编译连接,生成B.dll,使用查看DLL文件的工具,就能够看到B.dll中存在一个名为fun的输出函数。
我以为这就是为什么我们不对ufusr/ufsta这样的函数做输出修饰,而它们依然可以输出的缘由。
欢迎光临 iCAx开思工具箱 (https://t.icax.org/)
Powered by Discuz! X3.3