iCAx开思工具箱

标题: 可否由UG动态库向导扩展为win32dll? [打印本页]

作者: boliang99    时间: 2005-6-9 22:54
标题: 可否由UG动态库向导扩展为win32dll?
可否由UG动态库向导扩展为win32dll?如何实现呢?
作者: 深夜摔键盘    时间: 2005-6-9 23:35
UG动态库向导所做的DLL,就是win32 dll
作者: boliang99    时间: 2005-6-10 10:45
UG动态库向导所做的DLL,就是win32 dll
---
谢谢键盘兄,如果是这样,
  
一般用动态库向导生成的win32dll 都有stafx.h,而ug动态库为什么没有?
  
我想在UG向导环境中隐式加载win32dll,编译时会报错头文件tablelinking.h(23) : error C2504: 'CWinApp' : base class undefined
为什么呢?
  
有没有办法在UG向导环境中加载win32dll呢?
作者: 深夜摔键盘    时间: 2005-6-10 11:23
stdafx.h是VC++编译器默认添加的。C程序就没有。它可以去掉的,设置一下工程设置里的预编译头文件项就可以。
  
你说的出错,是不是因为你include的文件中有MFC类的声明? 而你的win32 dll没有设置为支持MFC库。如果你include的文件中是纯的C接口的声明,不应该出现问题。常规的MFC的DLL可以被任何WIN32程序所调用。
  
要了解DLL,去这里看看:
https://kenbeyond.blogchina.com/kenbeyond/927391.html
作者: boliang99    时间: 2005-6-11 12:07
嗯,道理,我在UGwizarddll头文件加#inclde <windows.h>后用显式链接是可以,说明UGwizarddll是可以调用win32动态库,至于隐式链接,试了几次,因为该win32dll头文件有些ADO指针声明,还是编译不了。还在想办法
作者: boliang99    时间: 2005-6-11 12:12
对了,“我想在UG向导环境中隐式加载win32dll,编译时会报错头文件tablelinking.h(23) : error C2504: 'CWinApp' : base class undefined 为什么呢? ”---刚开始还以为UGwizarddll不支持WIN32的类呢,加#inclde <windows.h>头文件就不会这样报错。
作者: 深夜摔键盘    时间: 2005-6-11 17:59
最好别采用UG向导,直接使用MFC  DLL格式。这样可以避免许多问题。
作者: boliang99    时间: 2005-6-12 10:24
是这样的。但因为原来已经用USTYLER做好了部分控件,虽然感觉不是很爽,但要全部重写,也挺花时间。现在是在想个办法,要让原来的控件能与SQL数据库通信就行,但试了好久,不怎么理想啊,键盘兄你有什么好办法吗?
下面是我的控件间数据传递几种方案:
1、数据文件,缺点显而易见,而且系统已经有部分数据在SQLSERVER2000内
2、UGWIZARDDLL与SQL通信,想把编好的UGWIZARDDLL扩展成完整的WIN32DLL或MFC常规DLL,但处处受限,不好扩展,真不知道UGWIZARD到底怎么封装的,又怎么扩展?
3、UGWIZARDDLL与SQL通信,通过调用WIN32DLL输出的ADO_RECORDSET指针,利用指针与数据库通信,试过,但在UGWIZARD中RECORDSET指针就失灵,不能读也不能写,哎,想放弃!
4、新建MFCDLL建立ADO与数据库连接,C++文件读写与ADORECORDSET通信。加载UG控件让UG与数据文件通信。好复杂啊,还没试。
方案2似乎理想一点,不知道能不能实现?键盘兄,一定给我出个主意
作者: 深夜摔键盘    时间: 2005-6-12 11:22
你的第二种方法,和第四种方法没什么区别吧,在一个win32 dll中,添加MFC的库和头文件就是了,这需要你了解需要哪些文件。
  
第4种可行。
  
第三种应该也可行。ADO是COM技术,COM是二进制文件,应该可以调用的。我觉得你要想在原来的程序环境中工作,还是选用这种较合理。做一个资源DLL,里面封装ADO的对象指针。可能难度大吧。
  
我以前只是在MFC DLL里用过ADO,用UISTYLER没问题,但后来因为商用数据库不能满足我们的需要,就没有再做过这个。
作者: boliang99    时间: 2005-6-13 17:42
没怎么表达明白,
第二种方案通信过程应该是这样:UGWIZARD--(扩展)MFC==SQL(--表示向前单向,==表示双向,下同)
第四种方案是这样:UGWIZARD==数据文件==基于MFC的ADO连接动态库函数==SQL。因为第三种方案WIN32动态库输出的指针到UG环境就失灵(用WIN32控制台也不行,我想可能是动态库无法调用RECORDSET类函数)所以改用MFCADODLL输出数组、接收数组并更新SQL。UGWIZARD与MFCADODLL之间以数据文件为中介!应该但也不灵活多少啊!
作者: boliang99    时间: 2005-6-13 18:21
第三种应该也可行。ADO是COM技术,COM是二进制文件,应该可以调用的。我觉得你要想在原来的程序环境中工作,还是选用这种较合理。做一个资源DLL,里面封装ADO的对象指针。可能难度大吧。  
  
------不大明白,那为什么加载动态库后,RECORDSET->list member function再也看不到成员函数呢?是不是因为DLL输出的记录集没有成员函数(ADO封装,当然不会重定义),而此时记录集指针不能再调用ADO记录集函数??也就是说DLL内有什么就读出什么或能做什么,而要它再去调用一个不在DLL内的函数就不行?每想到这,还是感觉自己的计算机基础有点菜,毕竟是半路出家啊,键盘兄,请指点指点
  
你所说的这个资源DLL,要怎么来封装指针才好呢?我把WIN32_ADO_DLL文件传上来,帮我看看,这样封装,行不行?
作者: boliang99    时间: 2005-6-13 18:22
part02
作者: boliang99    时间: 2005-6-13 18:23
part03
作者: boliang99    时间: 2005-6-13 18:24
怎么不见了我的贴子啊,重发
  
第三种应该也可行。ADO是COM技术,COM是二进制文件,应该可以调用的。我觉得你要想在原来的程序环境中工作,还是选用这种较合理。做一个资源DLL,里面封装ADO的对象指针。可能难度大吧。  
  
------不大明白,那为什么加载动态库后,RECORDSET->list member function再也看不到成员函数呢?是不是因为DLL输出的记录集没有成员函数(ADO封装,当然不会重定义),而此时记录集指针不能再调用ADO记录集函数??也就是说DLL内有什么就读出什么或能做什么,而要它再去调用一个不在DLL内的函数就不行?每想到这,还是感觉自己的计算机基础有点菜,毕竟是半路出家啊,键盘兄,请指点指点
  
你所说的这个资源DLL,要怎么来封装指针才好呢?我把WIN32_ADO_DLL文件传上来,帮我看看,这样封装,行不行?
作者: boliang99    时间: 2005-6-13 18:26
奇怪,贴不上的?
第三种应该也可行。ADO是COM技术,COM是二进制文件,应该可以调用的。我觉得你要想在原来的程序环境中工作,还是选用这种较合理。做一个资源DLL,里面封装ADO的对象指针。可能难度大吧。  
  
------不大明白,那为什么加载动态库后,RECORDSET->list member function再也看不到成员函数呢?是不是因为DLL输出的记录集没有成员函数(ADO封装,当然不会重定义),而此时记录集指针不能再调用ADO记录集函数??也就是说DLL内有什么就读出什么或能做什么,而要它再去调用一个不在DLL内的函数就不行?每想到这,还是感觉自己的计算机基础有点菜,毕竟是半路出家啊,键盘兄,请指点指点
  
你所说的这个资源DLL,要怎么来封装指针才好呢?我把WIN32_ADO_DLL文件传上来,帮我看看,这样封装,行不行?
作者: 深夜摔键盘    时间: 2005-6-13 19:22
你的UG DLL支持C++吗?
作者: boliang99    时间: 2005-6-13 22:09
不支持?不会吧?我按下图选的,怎么测定的?
作者: 深夜摔键盘    时间: 2005-6-13 22:11
你没放UG DLL,我不清楚它不是C格式的DLL,所以问了一下。]
我再考虑一下。
作者: boliang99    时间: 2005-6-13 23:00
我做了个,问题不少,发给你看看
作者: 深夜摔键盘    时间: 2005-6-14 17:47
不用那么麻烦了。
直接在你的UG DLL里import ado库,就可以用。
作者: boliang99    时间: 2005-6-14 21:18
也就是说不用动态库?那关键还是把UDWIZARD扩展到常规的WIN32DLL或MFC的问题啊,怎么扩展呢?
不大明白,可以帮我修改一下,放上来吗?
作者: 深夜摔键盘    时间: 2005-6-15 15:57
连接库的形式实际上就两种,能导出MFC类的和不能导出MFC类的。
  
你的目的不就是想在你的DLL中使用ADO么?你就按照ADO的使用规范,用就就是了,不会有什么问题。
  
如果你要想在DLL中用MFC,在工程设置里引入MFC的库,添加几个常用的头文件,就可以使用MFC。
  
你先不要建很复杂的工程,用最简的代码测试一下看看。
作者: boliang99    时间: 2005-6-17 17:09
是啊,我是想在UGWIZARDDLL中使用ADO。但总是实现不了。
  
发现了一个问题:
   UIstyler生成的文件得C文件,不是C++,所以用不上ADO。
如果把*_template.C重命名为*_template.Cpp,然后再把预编译文件#include <*.h>,更改为"*.h"编译可以通过,此时就可以添加ADO函数,编译也没问题。但用UG打不开所生成的DLL文件,ug提示“incorrect  callback argument"。不知为什么?
作者: boliang99    时间: 2005-6-17 18:23
哈哈,成功与失败只有一步之遥。
终于搞明白了,uistyle对话框应用ADO的方法可以这样:
1、建立一个UGWIZARDDLL,选择C++及USE UG/OPEN C++CALL。
2、把uistyle生成的*_template.c及*.h内的东西分别拷入(复盖)上步生成的*.cpp和*.h中
3、加入stdafx.cpp、stdafx.h并按ADO规范与数据库相连就OK了
4、编译的时候,工程--设置--general --MFCS最好选择use MFC in a static library
  
再次谢谢键盘兄给我的很多指导、帮助,谢谢各位的关注!
作者: 深夜摔键盘    时间: 2005-6-17 18:57
搞定了就好。
  
其实你用一个DLL导出ADO的类,这种想法很不坏。你也可以不导出类,把你的ADO指针在DLL中初始化,直接导出C接口,让C接口返回ADO指针应该也可以。这样程序结构更清晰,在其他程序中也可以很容易的加载这个DLL来实现ADO的访问。




欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3