找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1430|回复: 19

[转贴]:如何实现MDL调用DLL(英文)

[复制链接]
发表于 2002-12-10 16:28:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1. Create a dll in MS Dev studio just as you normally would. Make sure that
all your exported functions are declared as extern "C", this will prevent
name mangling. In your MDL modules you will need to include function
prototypes for the dll functions. They should be defined as nativeCode.
     i.e. nativeCode int catdll_MTOAddComp ( void );

2. Create a dls (dynamic link specification) file in your mdl project. This
file helps the mdl linker resolve imported functions. Here is an example:
catdll.dls:
    %Version 0x551

    %ModuleName catdll

    %Functions
    catdll_MTOAddComp ( _catdll_MTOAddComp )
    catdll_MTOEnd ( _catdll_MTOEnd )
    %EndFunctions

    %Variables
    %EndVariables

    %End

As you can see this file imports two functions from a dll called catdll.dll.
Take note of the _ preceding the function name inside the parentheses. This
is because the project settings (in C++ Builder) for this particular dll has
"Calling Convention" set to "C". If it were set to "Standard Call" then the _
preceding the function name would not be necessary. i.e.
    catdll_MTOAddComp ( catdll_MTOAddComp )

3. You must compile the dls file into a dlo file, this is done in your mdl
project make file, the line would look like this:
    #---------------------------------------------
    # Compile the Dynamic Load Specification
    #---------------------------------------------
    $(mdlLibs)catdll.dlo      : $(baseDir)catdll.dls

4. Link the dlo file with your other object files, you can do this by simply
adding the dlo to the list of project object files in your make file. Like
this:
    #----------------------------------------------------------------------
    # Define macros for files included in our link and resource merge
    #----------------------------------------------------------------------
isoskObjs = \
        $(o)isosk.mo \
        $(o)mto.mo \
        $(o)symconfg.mo \
        $(mdlLibs)catdll.dlo \
        $(mdlLibs)pwvar.dlo \
        $(mdlLibs)liclib.dlo \
        $(mdlLibs)bitwyse.dlo

For more information on dlm's see the "Advanced Concepts" section (chapter
20) of the MDL Programmers Guide (go to the table of contents in the on-line
help, also, be sure you are looking at the MDE help file and not the general
MicroStation help file).

Thats it, DLM's in 4 steps.


--------------------------------------------------------------------------------------------------------------------
我按上述步骤测试了一下,编译没有问题

但是进入MS载入ma是提示如下:
Unable to resolve ******* from lib kernel32 for '*****'

可是我已经把kernel32.dll文件复制到我的ma文件目录了
而且我所调用的API在VB中试过使用没有任何问题

而且还没有进入ma的debug界面就出现此错误了,再次调入ma,MS的错误信息窗口就关闭了,除非重启MS就再也无法进入这个界面了

那位大侠帮帮忙?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2002-12-13 09:52:50 | 显示全部楼层
该问题已解决,主要还是DLS文件的定义问题。
Windows API函数内部都分两个版本(一个是ASCII的,一个是WideChar的)。所以调用时要在DLS中用括弧著名是哪个版本。

%ModuleName kernel32
%Functions
GetVolumeInformation ( GetVolumeInformationA)
%EndFunctions
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-12-15 11:36:30 | 显示全部楼层
谢谢你 成功了
怎么让他直接找到系统目录下的kenel32.dll
还有个问题, 自己写的程序vc的 函数 如何用mdl调用
是将他写成dll 吗   dll  如何建立 如何调用
能给传个例子吗
能留下您的icq或qq吗
gp341@sohu.com
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-12-15 17:55:53 | 显示全部楼层
最初由 gp341 发布
[B]谢谢你 成功了
怎么让他直接找到系统目录下的kenel32.dll
还有个问题, 自己写的程序vc的 函数 如何用mdl调用
是将他写成dll 吗   dll  如何建立 如何调用
能给传个例子吗
能留下您的icq或qq吗
[email]gp341@... [/B]


要让MDL直接调用DLL文件而不把DLL文件复制到ma文件目录,必须在MS中定义MS_MDL环境变量使之包含Windows(Winnt)\System32

关于vc文件如何转成DLL还待MS迷来解答,我基本不懂VC
我有ICQ和QQ,但基本不上线,需要联系还是在这或者Email吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-12-16 08:20:51 | 显示全部楼层
在VC6++中创建新项目时可选择Win32 Dynamic-Link Library以建立不带MFC的DLL。选择MFC AppWizard (dll)以建立支持MFC的DLL。MFC是Microsoft Foundation Class的缩写,它把大部分的Win32函数以类的形式进行包装以体现C++的面向对象的特性。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-12-17 14:23:03 | 显示全部楼层
程序要给别人用 让他们设置不好 我用程序更改不了“MS_MDL"
%ModuleName kernel32
%Functions
GetVolumeInformation ( GetVolumeInformationA)
%EndFunctions

在  %ModuleName kernel32   这一行只能调一个dll 文件吗
加上多个路径不行吗 我是了,不行
你们有好办法吗
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-12-17 14:56:25 | 显示全部楼层
我在MS V8下已经试过,不需设置MS_MDL环境变量既可调用任何系统的DLL。

如要同时调用多个DLL中的内容,我觉得可写多个DLS,把它们都编译成DLO再链接到你的MA中不就行了?!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-12-17 15:08:32 | 显示全部楼层
我遇到一个比较恶心的问题
在使用GetVolumeInformation ( GetVolumeInformationA)时由于Windows2000可以任意更改盘符,所以不能简单的只读取C:信息
后来编了一些判断循环才终于搞定
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-12-18 09:54:23 | 显示全部楼层
我读取cpu的信息 读取硬盘物理序列号的也有,就是太长
不知道读取的对不对 源程序是从网上找的
就差主板的序列号 你知道吗
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-12-18 15:49:41 | 显示全部楼层
最初由 gp341 发布
[B]我读取cpu的信息 读取硬盘物理序列号的也有,就是太长
不知道读取的对不对 源程序是从网上找的
就差主板的序列号 你知道吗 [/B]


能把这个文件发给我吗?
有编译成Dll的吗?

好像要读取硬盘物理系列号只能通过汇编或者以VXD模式才行啊
Windows 2000下用DeviceIOControl这个API好像也可以实现,但98系统不行
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-12-19 09:42:19 | 显示全部楼层
读取硬盘物理系列号的太乱 我编译成exe可以 编译成dll 出错 我查不出原因
你要源码吗????
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-12-19 09:46:19 | 显示全部楼层
最初由 gp341 发布
[B]读取硬盘物理系列号的太乱 我编译成exe可以 编译成dll 出错 我查不出原因
你要源码吗???? [/B]



对啊
:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-12-19 15:03:52 | 显示全部楼层
发过了 编译好的运行文件在dos 模式下运行才能显示 第二行应该是
硬盘物理系列号 跟别的软件读出的相同 这个程序适合98/me/nt/2000/xp系统
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-12-23 11:36:32 | 显示全部楼层
谢谢!
:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 70个

财富等级: 招财进宝

发表于 2002-12-24 00:42:05 | 显示全部楼层
能给我发一份吗?谢谢!gyl0@sohu.com
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 16:19 , Processed in 0.365509 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表