dll的问题

cdmar79 2007-02-06 02:46:00
我用两种方式开发的工程(BCB 5.0 + pack1)
方式1。静态调用dll(工程中加 .Lib,运行时伴随 .dll)
方式2。直接cpp包含

发现了一个怪事,方式1的程序对最小化没反应的(只是把窗体置后,不最小化),而方式2则没有问题

请问,是不是我的dll工程的设置不对导致的呢?还是BCB的问题
...全文
268 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
kangji 2007-02-07
  • 打赏
  • 举报
回复
学习
cdmar79 2007-02-07
  • 打赏
  • 举报
回复
找到问题了

是DLL中的
#include <FileCtrl.hpp>
惹的祸

只是为了使用DirectoryExists函数。。。
算了,自己用GetFileAttributes替代吧!
cdmar79 2007-02-07
  • 打赏
  • 举报
回复
干脆,再把我N年前发现的Forms.pas(相当与Forms.hpp)的问题也描述一下,供大家参考!

如果dll中出现uses Forms.pas(C++:#include <Forms.hpp>),无论是直接的还是间接的。那么
在动态加载(先LoadLibrary再FreeLibrary)的时候,内存会泄露(每次大约4k~8k左右),如果反复这样动态加载,内存泄露就会非常明显;如果没有Forms.pas则不会出现泄露。

这回的问题是无法最小化。想来是消息传递出问题了,也就是消息没传到我想要它去的地方。为什么呢?

会不会是这样的,forms会在每次使用它的时候向内存注册一个新的VCL环境,而Windows系统在传递消息的时候,没有把消息传递到新的环境,而是只到了老环境,导致消息无法相应;同时,反复使用forms,相当于反复开新环境,就必然会消耗内存。。。
cdmar79 2007-02-07
  • 打赏
  • 举报
回复
再补充一点

在FileCtrl.hpp中

// Borland C++ Builder
// Copyright (c) 1995, 1999 by Borland International
// All rights reserved

// (DO NOT EDIT: machine generated header) 'FileCtrl.pas' rev: 5.00

#ifndef FileCtrlHPP
#define FileCtrlHPP
。。。。
#include <Forms.hpp> // Pascal unit //////////////////问题就出在这里了
。。。

归纳整个问题如下:
首先,dll中要使用FileCtrl.hpp的DirectoryExists函数
那么就出现了与
http://www.80diy.com/home/20000407/11/6707.html
类似的情况。为了能够进行编译,就不得不选中build with runtime package。

选中了build with runtime package,则不在dll中带入VCL环境,这实际上导致了
这么一种组合
dll中#include <Forms.hpp>,并且dll是build with runtime package
在这样的情况下,主调用程序在使用dll的时候就会无法最小化

我后来又实验了一个,在dll中直接#include <Forms.hpp>,并且使用了Forms中的至少一个函数,结果就是无法最小化的。。。这个实验与我实际遇到的问题的差别就是:实验直接#include <Forms.hpp>,而实际中我是间接#include <Forms.hpp>的。

看来,还是验证了我一开始的疑窦,问题还是在Forms.hpp上的。。。
估计是个bug

我以前用delphi 6的时候遇到的就是这个问题,现在看来,如果C++ Builer 6是Delphi 6的弟兄,那么在C++ Builder 6中还会存在这个问题(我现在用的是 C++ Builder 5),所以,提出来供大家参考。

cdmar79 2007-02-06
  • 打赏
  • 举报
回复
刚又测试了好久

估计是dll出问题了,可能是包含了BCB的某个.h/.hpp后导致的。

现在正在一个一个验证头文件包含的可能错误

不过,我隐约感到一个问题,forms.hpp
因为我多年前用delphi的时候,发现当dll包含forms.pas的时候会有内存泄露,而BCB中的forms.hpp正好与forms.pas对应。。。
希望不是这样

等我的测试结果吧!
xiaoshi0 2007-02-06
  • 打赏
  • 举报
回复
你发给我也没用,我也没有BCB的环境。

那你的意思是说,只要你用了那个dll文件,就会出现这样的情况,如果没用的话,就不会出现是么?

即使是这样,也不一定和你的DLL有关啊,或者你可以生成一个新的工程,然后包含你的DLL,然后你再看看是否还是有那样的情况。
cdmar79 2007-02-06
  • 打赏
  • 举报
回复
To xiaoshi0(Rain)

你有邮箱吗?我把工程发给你吧!
cdmar79 2007-02-06
  • 打赏
  • 举报
回复
1.窗体不是dll中的

2.“置后”是指,当前运行的窗体,当我按最小化按钮之后,窗体并未最小化到任务栏,而是失去焦点并停留在桌面上。

3。窗体属性未改动,就是工程默认的fsNormal,没有其他窗体特效



xiaoshi0 2007-02-06
  • 打赏
  • 举报
回复
你能不能把你的问题问得清楚一点,你的窗体是在DLL中创建的么?

你的窗体被你修改过属性么?

你说的“只是把窗体置后,不最小化”是什么意思?单纯的置后,为什么要最小化?你说的置后又是什么意思?
cdmar79 2007-02-06
  • 打赏
  • 举报
回复
我刚刚用了一个最简单的方式,模拟了我的两种方式

extern "C" __declspec(dllexport) int (__stdcall TestDll)(); 导出
生成testdll.dll,testdll.lib

然后,.exe工程
USELIB("E:\Lib\testdll.lib");
extern "C" __declspec(dllimport) int (__stdcall TestDll)(); 导入
程序执行正确,但就是.exe无法最小化
cdmar79 2007-02-06
  • 打赏
  • 举报
回复
都是默认的。。。。

我刚才找到一个delphi的相关问题

http://topic.csdn.net/t/20050426/13/3967566.html#

但是,还是没说怎么搞!
xiaoshi0 2007-02-06
  • 打赏
  • 举报
回复
你的窗体怎么创建的?用了哪些style和exstyle?
cdmar79 2007-02-06
  • 打赏
  • 举报
回复
可能会是什么问题??

我没有拦截消息

我试过了,用WndProc去跟踪方式1的窗口,结果,最小化就是跳不进去(无论是WM_SIZE还是WM_SYSCOMMAND)。

另,我对dll工程和exe工程都设置为
compiler: release
packages: build with run time package

调用的函数也很普通
int __stdcall CodeLength_Logger(MLogger &ALogger)
bool __stdcall Decode_Logger(TStream *Buffer, MLogger &ALogger)
MLogger是一个struct
xiaoshi0 2007-02-06
  • 打赏
  • 举报
回复
应该是你的程序有问题。

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧