我很晕,把exe打包进dll里?

zhangwuji156 2008-11-25 05:57:12
我们要做一个可供别的开发语言使用的dll,某些函数的功能可能比较复杂,本来我想用
纯C++写,比较难,用CB控件可能会好一点,但我想,既然是个通用的dll,连结构都不
用,怎么能用控件呢?但头儿告诉我,直接把控件或exe打包进dll里,我晕
...全文
202 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangwuji156 2008-11-26
  • 打赏
  • 举报
回复
library path?
如果直接编译带有TIdURI 的程序没问题,这到底是怎么回事,
library path,这个dll程序倒是生成一个.lib文件,我把这个文件包含进去也不行
jaffy 2008-11-26
  • 打赏
  • 举报
回复
错误的意思是没有实现体
估计是library path没有设置的原因
zhangwuji156 2008-11-26
  • 打赏
  • 举报
回复

//关键核心代码就是这样
TIdURI *URI = new TIdURI(lpURL);
try{

memcpy(lpProtocol, URI->Protocol.c_str(), URI->Protocol.Length());

memcpy(lpHost, URI->Host.c_str(), URI->Host.Length());

memcpy(lpPort, URI->Port.c_str(), URI->Port.Length());

memcpy(lpPath, URI->Path.c_str(), URI->Path.Length());

memcpy(lpFileName, URI->Document.c_str(), URI->Document.Length());
}__finally{
delete URI;
}
zhangwuji156 2008-11-26
  • 打赏
  • 举报
回复
有错误呀
...
#include <IdURI.hpp>
...
extern "C" void _stdcall ParseURL(const char* lpURL, char *lpProtocol, char *lpHost, char *lpPort, char *lpPath, char *lpFileName);
void _export _stdcall ParseURL(const char* lpURL, char *lpProtocol, char *lpHost, char *lpPort, char *lpPath, char *lpFileName)
{
TIdURI *URI = new TIdURI(lpURL);
try{
//edtProtocol->Text = URI->Protocol;
memcpy(lpProtocol, URI->Protocol.c_str(), URI->Protocol.Length());
//edtHost->Text = URI->Host;
memcpy(lpHost, URI->Host.c_str(), URI->Host.Length());
//edtPort->Text = URI->Port;
memcpy(lpPort, URI->Port.c_str(), URI->Port.Length());
//edtPath->Text = URI->Path;
memcpy(lpPath, URI->Path.c_str(), URI->Path.Length());
//edtDocument->Text = URI->Document;
memcpy(lpFileName, URI->Document.c_str(), URI->Document.Length());
}__finally{
delete URI;
}
}
错误代码
[Linker Error] Unresolved external 'Iduri::TIdURI::' referenced from F:\CBUILDER\PARSEURL DLL\UNIT1.OBJ
[Linker Error] Unresolved external '__fastcall Iduri::TIdURI::TIdURI(const System::AnsiString)' referenced from F:\CBUILDER\PARSEURL DLL\UNIT1.OBJ
cczlp 2008-11-26
  • 打赏
  • 举报
回复
直接用CB做DLL不就更简单了. 保证DLL导出函数中的返回类型和参数类型是标准C++类型就可以了.
iamhaiergg 2008-11-26
  • 打赏
  • 举报
回复
刚刚做过一个类似的, 帮顶!!!
zhangwuji156 2008-11-26
  • 打赏
  • 举报
回复
哇!!!!!!!!!!!!!!!!果然,神奇,
我用CB的Form1->Show();出来的对话框,在VC里竟然能显示出来,哈哈哈!!
nbzip 2008-11-26
  • 打赏
  • 举报
回复
你把ParseURI全部东东都移到DLL中,然后在DLL的导出地方做个CALLFUN函数.

你在别的地方调用CALLFUN(DLL)函数就行了.CALLFUN函数只要按C语言标准规范来写,一般程序都能用上.

关于把EXE做成DLL包里面去,不太知道,应该能把EXE放到RC文件里面吧.不过可以把一个功能做成EXE文件句后以调参数做也行的.呵呵.
zhangwuji156 2008-11-26
  • 打赏
  • 举报
回复
帖子已经加分

就拿CB例子程序中那个\ParseURI有例吧,它是个用于分析URL的程序,输入一个URL,它会分析出协议名,主机名,端口,路径,文件名。如果已经做好该程序,那我怎么把它打包成一个可供别人使用的dll?请详细说明步骤,或者哪儿有具体做法?
zhangwuji156 2008-11-26
  • 打赏
  • 举报
回复
在CB中也有问题,只有第一个http得到是成功的,后面就不对了
void (*ParseURL)(LPCTSTR lpURL, char *lpProtocol, char *lpHost, char *lpPort, char *lpPath, char *lpFileName);
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HINSTANCE hInst=NULL;
hInst = LoadLibrary("ParseURL.DLL");
if(hInst)
{
(FARPROC &)ParseURL=GetProcAddress(hInst,"ParseURL");
AnsiString strURL = "http://wwww.scxxt.com.cn/%B7%C5%C9%FA.mp3";
char *lpProtocol = new char[5];
ZeroMemory(lpProtocol, 5);
char *lpHost = new char[50];
ZeroMemory(lpHost, 50);
char *lpPort = new char[50];
char *lpPath = new char[260];
char *lpFileName = new char[50];
ZeroMemory(lpFileName, 50);
ParseURL(strURL.c_str(), lpProtocol, lpHost, lpPort, lpPath, lpFileName);

edtProtocol->Text = lpProtocol;
edtHost->Text = lpHost;
edtPort->Text = lpPort;
edtPath->Text = lpPath;
edtDocument->Text = lpFileName;
FreeLibrary(hInst);
}
else
{
::MessageBox(NULL, "无法加载ParseURL.dll文件", "信息提示", MB_OK);
FreeLibrary(hInst);
}
}
zhangwuji156 2008-11-26
  • 打赏
  • 举报
回复
我晕,不好意思
hInst = LoadLibrary("DLLServer.DLL"); 这句应该是
hInst = LoadLibrary("ParseURL.DLL"); 直接复制了……
zhangwuji156 2008-11-26
  • 打赏
  • 举报
回复
想起个事儿,我这个dll直接编译出来是project2.dll,然后我改成parseURL.dll,这个有关系吗?
zhangwuji156 2008-11-26
  • 打赏
  • 举报
回复
我在VC中调用该DLL,没有报错,但运行时候却出错,程序错误,自动退出了!

void (*ParseURL)(LPCTSTR lpURL, char *lpProtocol, char *lpHost, char *lpPort, char *lpPath, char *lpFileName);
void CDLLTestDlg::OnButton2()
{
// TODO: Add your control notification handler code here
HINSTANCE hInst=NULL;
hInst = LoadLibrary("DLLServer.DLL");
if(hInst)
{
(FARPROC &)ParseURL=GetProcAddress(hInst,"ParseURL");
CString strURL = "http://wwww.scxxt.com.cn/%B7%C5%C9%FA.mp3";
char *lpProtocol = new char[50];
char *lpHost = new char[250];
char *lpPort = new char[50];
char *lpPath = new char[260];
char *lpFileName = new char[50];
ParseURL(strURL.GetBuffer(0), lpProtocol, lpHost, lpPort, lpPath, lpFileName);
//GetDlgItem(IDC_EDIT1)->SetWindowText(lpProtocol);
FreeLibrary(hInst);
}
else
{
::MessageBox(NULL, "无法加载ParseURL.dll文件", "信息提示", MB_OK);
FreeLibrary(hInst);
}
}
jxw1987628 2008-11-26
  • 打赏
  • 举报
回复

// 可以根据报错的提示

// 如你报错的unresolved TId....这些是indy的类

// 另1个方面是总结解决这方面问题的经验
zhangwuji156 2008-11-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 unsigned 的回复:]
应该是在BCB程序目录的LIB\Release里面的Indy.lib
[/Quote]
高手!果然成功了,
以前发生过类似的问题,就是编译dll不知道该加哪个lib,如果碰到这种问题,有没有通用的方法,知道到底是缺哪个lib?
僵哥 2008-11-26
  • 打赏
  • 举报
回复
应该是在BCB程序目录的LIB\Release里面的Indy.lib
僵哥 2008-11-26
  • 打赏
  • 举报
回复
把Indy*.lib添加工程当中编译。
yuanreid 2008-11-25
  • 打赏
  • 举报
回复
如果是在Windows平台上,使用COM封装的效果会更好些。
僵哥 2008-11-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhangwuji156 的帖子:]
我们要做一个可供别的开发语言使用的dll,某些函数的功能可能比较复杂,本来我想用
纯C++写,比较难,用CB控件可能会好一点,但我想,既然是个通用的dll,连结构都不
用,怎么能用控件呢?但头儿告诉我,直接把控件或exe打包进dll里,我晕
[/Quote]
内部实现使用控件是不会有问题的。只要导出的接口函数或过程的参数及返回值考虑到兼容问题即可。

604

社区成员

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

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