| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2047 人关注过本帖
标题:怎样用 VC++6.0 建立一个简单的有 DllMain 的.c(不要.cpp)的 Dll ?
取消只看楼主 加入收藏
tm1mc2
Rank: 2
等 级:论坛游民
帖 子:28
专家分:46
注 册:2014-8-21
结帖率:50%
收藏
已结贴  问题点数:10 回复次数:3 
怎样用 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
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
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
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.025875 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved