delphi下调用VC写的DLL的问题

lyx_allen 2008-09-01 11:48:59
VC中的函数说明:
HANDLE WINAPI DLBT_Downloader_Initialize (LPCSTR torrentFile,LPCSTR outPath);

我在delphi下定义它:
function DLBT_Downloader_Initialize(torrentFile:LPCTSTR;outPath:LPCTSTR):THandle; stdcall; external 'bt.dll';
那个DLL文件我也拷贝到与执行文件相同的目录下了;可是运行是还是提示“无法定位程序输入点DLBT_Downloader_Initialize 于动态链接库bt.dll上"
请问该怎么解决呢?
...全文
107 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
mdejtod 2008-09-19
  • 打赏
  • 举报
回复
最好不要那样用,我记得用DELPHI写的DLL,这样调用不会出问题,但是VC的DLL,要先装入,即GetProcAddress
简单的如下:
type
TFunc_DLBT_Downloader_Initialize = function (torrentFile:LPCTSTR;outPath:LPCTSTR):THandle;
stdcall;
var hAudioDll : Integer;
Func_DLBT_Downloader_Initialize :TFunc_DLBT_Downloader_Initialize ;
implementation
initialization
hAudioDll := LoadLibrary('*.dll');
if hAudioDll = 0 then exit;
@Func_DLBT_Downloader_Initialize := GetProcAddress(hAudioDll,'DLBT_Downloader_Initialize');
finally
FreeLibrary('*.dll');
end.
monkchen 2008-09-18
  • 打赏
  • 举报
回复
顶楼上
内存泄漏 2008-09-10
  • 打赏
  • 举报
回复
在VC端编写.def文件可以解决导出函数名不规则的问题..
iamduo 2008-09-03
  • 打赏
  • 举报
回复
反过来没有试过,但是据我说知。有些麻烦的。
或许,2楼说的就是这种情况。
实在不行的时候,需要自己写个VC的DLL,封装那个DLL,而以Delphi能认识的的方式导出。
iamduo 2008-09-03
  • 打赏
  • 举报
回复
LPCTSTR在Delphi里有这个吗? PChar吧?
我写过从C里调用D6的dll,如下

/////////////////////////////////////////////////////////////////////////////
//调用DuoDLL 080403
typedef int (__stdcall *ReadDuoIniA)(char *);
typedef char * (__stdcall *DuoDirectoryA)(HANDLE);
typedef (__stdcall *DuoCOMA)(HANDLE);
/*typedef char * (__stdcall *MyTestA)(char *);
typedef char * (__stdcall *DuoDirA)(char *,int,int);
typedef (__stdcall *DuoAsf2AviA)(char *);
*/

/////////////////////////////////////////////////////////////////////////////
// CTouchDCApp

BEGIN_MESSAGE_MAP(CTouchDCApp, CWinApp)
//{{AFX_MSG_MAP(CTouchDCApp)
//}}AFX_MSG_MAP
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTouchDCApp construction

CTouchDCApp::CTouchDCApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CTouchDCApp object

CTouchDCApp theApp;

/////////////////////////////////////////////////////////////////////////////
// CTouchDCApp initialization

BOOL CTouchDCApp::InitInstance()
{
AfxEnableControlContainer();//包含ActiveX
CTouchDCDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
}
else if (nResponse == IDCANCEL)
{
}
return FALSE;
}
//exp.
// Duo_CommDebug=theApp.ReadDuoIni("CommDebug");
int CTouchDCApp::ReadDuoIni(CString sName)
{
ReadDuoIniA aa;
HINSTANCE h=LoadLibrary("DuoDLL.dll");
aa=(ReadDuoIniA)GetProcAddress(h,"ReadDuoIniA");
char *cc=(char *)(LPCTSTR)sName;
return aa(cc);
}
/*
void CTouchDCApp::MyTest(CString AStr)
{
MyTestA aa;
HINSTANCE h=LoadLibrary("DuoDLL.dll");
aa=(MyTestA)GetProcAddress(h,"MyTestA");
char *cc=(char *)(LPCTSTR)AStr;
aa(cc);
}
*/
//exp.
//sPath=theApp.DuoDirectory(theApp.GetMainWnd()->GetSafeHwnd());
CString CTouchDCApp::DuoDirectory(HANDLE hh)
{
DuoDirectoryA aa;
HINSTANCE h=LoadLibrary("DuoDLL.dll");
aa=(DuoDirectoryA)GetProcAddress(h,"DuoDirectoryA");
return aa(hh);
}

void CTouchDCApp::DuoCOM(HANDLE hh)
{
DuoCOMA aa;
HINSTANCE h=LoadLibrary("DuoDLL.dll");
aa=(DuoCOMA)GetProcAddress(h,"DuoCOMA");
aa(hh);
}



Delphi里是


function ReadDuoIniA(AName:PChar):Integer;stdcall;
var s:String;
begin
s:=StrPas(AName);
Result:=ReadIni(s);
end;
  • 打赏
  • 举报
回复
函数名可能被改成.
'?DLBT_Downloader_Initialize@@YGPAXPBD0@Z'

你还是用工具看看改成啥了
参数都用PChar类型
鲫鱼跃龙门 2008-09-02
  • 打赏
  • 举报
回复
这么定义就好了:

function _DLBT_Downloader_Initialize@8(torrentFile:LPCTSTR;outPath:LPCTSTR):THandle; stdcall; external 'bt.dll';
柯本 2008-09-01
  • 打赏
  • 举报
回复
先试一下:
function _DLBT_Downloader_Initialize(torrentFile:LPCTSTR;outPath:LPCTSTR):THandle; stdcall; external 'bt.dll';
如果还不行:
看一下VC的定义,并看一下它是C后缀还是C++后缀,如是C++且没有extern "C" ,那就繁了,看一下:
http://topic.csdn.net/t/20060710/15/4871016.html
另外,你可用delphi自带的tdump,看一下bt.dll的导出函数名(如果后面有参数,那肯定是C++的导出函数)
如果是C++导出函数且你无法改vc源码,就比较麻烦了

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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