DLL问题??

w88529593 2008-11-09 04:47:01
我新建一个DLL工程,然后把其他VCL工程中的Form加入到当前的工程中,用来测试DLL窗体,居然编译出来的DLL文件在其他程序里面LoadLibrary加载失败,我再新建个DLL工程,然后在这个工程里面,直接新建个Form居然就可以的,是不是DLL工程加入已经存在的FORM时,什么地方需要设置吗?
...全文
113 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxw1987628 2008-11-11
  • 打赏
  • 举报
回复
你用的2007 呢。我还是6.0

咋测试?
w88529593 2008-11-11
  • 打赏
  • 举报
回复
结贴散分吧,我找了好几台机器测试了结过都一样
jaffy 2008-11-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 w88529593 的回复:]
例如有FromA,FormB,原来FormB使用了FormA中的ADOConnection1,然后我把FormB的3个文件复制到新建的DLL工程文

件夹中,然后加入到DLL工程中,就是按工具栏上的"+"按钮添加到工程中的,然后我把FormB中的ADOQuery1的

Connection属性关联的FormA->ADOConnection1在属性编辑器里面删除了,然后把Unit2.cpp中的

#include "Unit1.h",也删除了,Unit2.cpp是FormB的CPP文件,然后保存 FormB 时BDS就提示关联错误,我选择了

[/Quote]
我选择了Remove Link,然后就编译了一下,可以通过编译

估计是这个地方的问题,最好看代码,如果不是很复杂就重画一次窗口,不是很费时间的
w88529593 2008-11-10
  • 打赏
  • 举报
回复

官方的补丁包update2我也打过了

就是想不明白到底是自己操作有误,还是怎么回事

各位伙计有空了,也做个测试,一起讨论讨论
w88529593 2008-11-10
  • 打赏
  • 举报
回复
初始化 COM ,释放 COM 这个都没啥问题,在DllEntryPoint中都加的有的。

各位伙计,有没有测试过你们的Exe中的窗体加入到DLL会不会出错,
难道是我的BDS有问题,也不可能,别人买的正版BDS专业版给我GHOST了一个

这个问题,甚是奇怪,搞了好多测试,翻来覆去,

想搞明白这个到底为何新建的就可以,添加进去的就不行呢

jxw1987628 2008-11-10
  • 打赏
  • 举报
回复
/*

既然LoadLibrary返回的是0,你可以用GetLastError

看看得到的是什么错误码,然后进一步分析错误原因所

在,另外dll工程代码修改后,注意重新build一下生成

新的版本。

*/
Behard 2008-11-10
  • 打赏
  • 举报
回复
你使用了 ADO?
是不是经典的 CoInitialize 问题呀
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
switch(reason)
{
case DLL_PROCESS_ATTACH: //初始化 COM
CoInitialize(NULL);
break;
case DLL_PROCESS_DETACH: //释放 COM
CoUninitialize();
break;

case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return 1;
}
w88529593 2008-11-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jasonnbfan 的回复:]
检查你 .dll文件路径。
[/Quote]

DLL完全和测试加载它的那个Exe程序在一文件夹,这种低级错误是不会犯的。

好像不是什么资源的问题

我把EXE工程的所有窗体都加到DLL工程中了,编译都可以编译通过,

就是在其他的EXE程序里面LoadLibrary的时候,返回NULL,载入失败?

我原来的那些窗体在EXE里面是可以运行,比较奇怪的事情啊
jasonnbfan 2008-11-09
  • 打赏
  • 举报
回复
检查你 .dll文件路径。
w88529593 2008-11-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yuanreid 的回复:]
其他VCL工程中的Form是否还依赖了其他的资源?
[/Quote]

这个Form中引用的其他窗体的资源我已经删除了,包括窗体之间的链接,以及包含的头文件,

如果还有其他什么资源之类没有删除干净的话,那么DLL应该编译不过去才对啊,比较郁闷,可奇怪
w88529593 2008-11-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 w88529593 的帖子:]
我新建一个DLL工程,然后把其他VCL工程中的Form加入到当前的工程中,用来测试DLL窗体,居然编译出来的DLL文件在其他程序里面LoadLibrary加载失败,我再新建个DLL工程,然后在这个工程里面,直接新建个Form居然就可以的,是不是DLL工程加入已经存在的FORM时,什么地方需要设置吗?
[/Quote]


引用的资源我已经删除了,包括窗体之间的链接,以及包含的头文件,如果还有其他什么资源之类的,那么DLL应该编译不过去才对啊,比较郁闷,可奇怪
w88529593 2008-11-09
  • 打赏
  • 举报
回复
例如有FromA,FormB,原来FormB使用了FormA中的ADOConnection1,然后我把FormB的3个文件复制到新建的DLL工程文

件夹中,然后加入到DLL工程中,就是按工具栏上的"+"按钮添加到工程中的,然后我把FormB中的ADOQuery1的

Connection属性关联的FormA->ADOConnection1在属性编辑器里面删除了,然后把Unit2.cpp中的

#include "Unit1.h",也删除了,Unit2.cpp是FormB的CPP文件,然后保存 FormB 时BDS就提示关联错误,我选择了

Remove Link,然后就编译了一下,可以通过编译,然后在DLL的主文件Unit1.cpp文件中导出一个函数用来显示FormB窗体

的,新建一个VCL Forms Application工程,在这个工程里面的Form1中放置一个Button按钮,然后在按钮的Click事件

中写上如下代码:

HANDLE hDll=LoadLibrary("Project1.dll");
if(hDll==NULL)
{
ShowMessage("Error");
return;
}

我在if语句这个地方设置了断点,跟进去后发现LoadLibrary("Project1.dll")返回值为DLL。

但是我把这个添加到DLL工程中的FormB从工程中删除了,然后再在DLL中新建个Form,编译后,LoadLibrary("Project1.dll")就没事,新建的这个窗体就可以显示出来。
jxw1987628 2008-11-09
  • 打赏
  • 举报
回复
/*你是怎么用新加入dll中的Form的 ?*/
yuanreid 2008-11-09
  • 打赏
  • 举报
回复
其他VCL工程中的Form是否还依赖了其他的资源?

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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