| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2047 人关注过本帖
标题:怎样用 VC++6.0 建立一个简单的有 DllMain 的.c(不要.cpp)的 Dll ?
只看楼主 加入收藏
tm1mc2
Rank: 2
等 级:论坛游民
帖 子:28
专家分:46
注 册:2014-8-21
结帖率:50%
收藏
已结贴  问题点数:10 回复次数:8 
怎样用 VC++6.0 建立一个简单的有 DllMain 的.c(不要.cpp)的 Dll ?
我建Dll文件,可是只许我填工程名,不许我填文件名,结果建立的只能是.cpp文件。如果强行更改成.c,就通不过链接。可是明明看见别人编出.c程序,他们是怎么做到的?
我基础不很薄弱,编过一些.c程序。
也看了几本dll书,编了几个dll都成功。
可都不是带DllMain的,而且不是.c。
我编了个几百行的dll。
我把别人的一个由多个文件组成的.c程序(工程),除了含DllMain的那一个之外,其它的.c和.h文件都删除,把那个文件的内容换上我的编码,编译连接都通过了。
但是一调试,居然不从DllMain入口,这样就无法调试。
现在想先从简单的几行的程序开始,逐步加内容,看看是哪一部分造成不能从DllMain入口的。
但就是没办法建立一个简单的.c的Dll。
搜索更多相关主题的帖子: c程序 而且 工程 
2014-09-15 11:34
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:4 
1、我刚做过测试  点c 和 点cpp 都可以制作成dll 没有你说的那个状态
2、建议可以抛弃vc6

DO IT YOURSELF !
2014-09-15 14:08
tm1mc2
Rank: 2
等 级:论坛游民
帖 子:28
专家分:46
注 册:2014-8-21
收藏
得分:0 
你能详细说一下点c如何操作制成dll好吗?
是不是一定要抛弃VC++6.0才能把点c制成dll?

[ 本帖最后由 tm1mc2 于 2014-9-15 20:09 编辑 ]
2014-09-15 20:08
stop1204
Rank: 9Rank: 9Rank: 9
来 自:福建省
等 级:贵宾
威 望:22
帖 子:295
专家分:1151
注 册:2013-9-8
收藏
得分:4 
VC没用过. 不过一开始建立一个文件的时候会问你类型吧?  控制台/应用程序/DLL

hl928452957@gmail点com

2014-09-16 03:03
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用tm1mc2在2014-9-15 11:34:24的发言:



但是一调试,居然不从DllMain入口,这样就无法调试。


这个是啥意思呢  ??
 
方便的话  把你的代码发出来 看看  以及你想干嘛  我觉得dll最大的用途就是组装函数库  其他的特殊用途还没怎么深研究

DO IT YOURSELF !
2014-09-16 08:22
天使梦魔
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
收藏
得分:4 
别调dll了,你基本的理论还很模糊,dll和exe是两回事,详细可以看windows核心编程19章.动态库技术

dllmain入口不是像exe一样的winmain从这里启动开始调试
dllmain入口带有4中状态机制(你自己写),为映射的dll内部消息.而决定dll状态的是调试dll的exe,这个exe可以是你自己写的,也可以是第三方exe.一般情况下无需去处理这部分,除非遇到很复杂的情况,遇到dll内存机制或者模块原理上有冲突就必须自己去实现.(反正我是从来不碰这里,遇到某些模块内存释放错误我也只是改动模块原理)
另外我不太懂你的意思,如果你说的不是这个意思而是dll呼叫方式的话默认是__stdcall,如果说调试链接不上可以自己检查一下对应的呼叫方式.调用的时候再检查符号导出没有,vs有个符号导出文档可以查询接口名字和编号,实在苦恼就调用编号,微软不建议用编号的,如果你dll输出强制了extern "C" 就用接口名字.如果调试器是自己的exe就添加lib,不用管名字和编号了.

再一个,不能用C代码编写dll.你自己设置上有问题,到工程属性里设置.至于vc6 ,我都忘了这个界面了.
最后奉劝你一句,如果原代码是exe的被你移植到dll,那我估计90%会出问题,写dll的时候以exe的逻辑去做,肯定挂的早.
2014-09-16 10:36
tm1mc2
Rank: 2
等 级:论坛游民
帖 子:28
专家分:46
注 册:2014-8-21
收藏
得分:0 
现在把问题简化一下。
我原先对那个能正常调试的别人的程序改动太多,难以找出哪里出错。
现在我只改动其中一处:
取消一个函数的调用。不调用了,直接执行其代码。
这个函数叫做RegisterIMEClass,它的功能是注册四个窗口类并建立4个窗口。
由于整个程序(由多文件组成)只有一个地方调用此函数,因此我觉得没有必要采用调用函数的方式,就把函数里的程序段直接代替原来的调用函数语句。
调用此函数的语句在Dll程序的入口函数DllMain的开头,见下图中划红线的语句:
图片附件: 游客没有浏览图片的权限,请 登录注册

被调用的函数参见下图:
图片附件: 游客没有浏览图片的权限,请 登录注册

取消调用方式了,就把该程序段中的形参hInstance都用实参g_hInst取代。
此外也取消函数申明。
原函数中的第一句(划红线的那句)“WNDCLASSEX wc;”定义了一个结构变量。
按规定,C语言的变量定义要放在函数开头,或者放到所有函数的前面作为全局变量。因此我把这条语句上移。
结果程序变成这样:
图片附件: 游客没有浏览图片的权限,请 登录注册

这个程序是个汉字输入方法,是个Dll,需要有个调用它的应用程序,一般选择记事本程序NOTEPAD.EXE来调试输入法Dll。
调试那个别人的程序时很正常:按F5以后记事本窗口跳出,选择此输入法后记事本窗口隐退,VC++回到前台,程序就从DllMain进入,到断点停下。
可是我这个改动后的程序,选择输入法后记事本仍然占据前台不肯隐退。这时按字母键的话,字母就出现在记事本上。这样就就无法调试。
2014-09-27 18:41
天使梦魔
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
收藏
得分:0 
你取消了窗口注册函数那dwFunction是怎么做的?
DLL_PROCESS_ATTACH状态下才开始注册窗口,而不是等到后面,DLL_PROCESS_ATTACH通知是DLL第一次被调用就进行,如果后期增加计数器是不调用的(启动DLL的第一个exe,后续再启动失效),说明exe一触动dll的时候就已经开始注册窗口了.

你把函数取消了,是否中间存在逻辑冲突,窗口调用先于窗口注册?windows没有默认值(未注册返回错误),规定必须先注册再跳用,中途切换窗口模式必须改变注册状态
2014-09-27 20:53
tm1mc2
Rank: 2
等 级:论坛游民
帖 子:28
专家分:46
注 册:2014-8-21
收藏
得分:0 
对不起我忘记这个帖子已经结贴了没有悬赏分了。
请要回答的朋友改到这里去回答(20分悬赏):
https://bbs.bccn.net/viewthread.php?tid=436690&page=1&extra=page%3D1#pid2439630

关于楼上的提问,我答复如下:
1,dwFunction仍跟原来一样作为开关选择,4种状况的判断和动作依旧。所做的修改仅仅把原来的一条函数调用语句换成原来被调用的函数里的实体程序段。差劲的这一段程序比较长,导致另外的3种情况的语句都依次下移一大段,图中篇幅有限没有都显示出来而已,并没有被删除。
2,至于“DLL_PROCESS_ATTACH状态下才开始注册窗口,而不是等到后面,DLL_PROCESS_ATTACH通知是DLL第一次被调用就进行,如果后期增加计数器是不调用的(启动DLL的第一个exe,后续再启动失效),说明exe一触动dll的时候就已经开始注册窗口了.”,改过的程序仍保留此功能。
3,“窗口调用先于窗口注册?”的问题,看不出修改后会导致这个问题。
2014-09-28 11:38
快速回复:怎样用 VC++6.0 建立一个简单的有 DllMain 的.c(不要.cpp)的 Dll ?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018216 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved