bcb的dll我只能用在bcb中,delphi的dll我也只能用在delphi中,
在网上查了很多资料,按其方法仍不成功,请各位大虾讲一下应注意
哪些问题,如果谁有这样的例子,能不能给我发一个,
我的email: ylm163net@163.net
25 个解决方案
up一下先,然后回答:
bcb里编写的dll在delphi里也可以调用,你是不是没有export,或者在调用程序里没有声明函数?在bcb里调用成功吗?
函数申明要一样就可以了,另外最好不要用String作为参数、返回值等。
你把你的贴出来我们看看就行了,很简单的。
bcb一端的dll代码,很简单,就是显示一个Form
unit2.h
----------------------------------
void __export _cdecl DoTest(void);
class TForm2 : public TForm
{
__published: // IDE-managed Components
TLabel *Label1;
void __fastcall FormShow(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm2(TComponent* Owner);
};
unit2.cpp
---------------------------
void DoTest(void)
{
Form2=new TForm2(NULL);
Form2->ShowModal();
delete Form2;
}
delphi一端的调用代码
--------------------
implementation
{$R *.DFM}
procedure DoTest;cdecl;external 'dlltest.dll';
procedure TForm1.Button1Click(Sender: TObject);
begin
DoTest;
end;
end.
也很简单,编译可以通过,运行时报告地址错误
印象中:
好像Pascal与C的参数出入栈方式相反,自己写Dll的话可能要用到PASCAL关键字,你可查查相关资料,从出错提示上看也应是这个问题。
具体我忘了,好像PASCAL中函数参数入栈为先右后左,C为从左到右
不存在栈的问题,两边都已声明为cdecl了,到底怎么回事
先定义函数
procedure Dotest;cdecl;
在implementation中实现
procedure DoTest;external 'dlltest' name 'DoTest';
这样写试试
看来是有些奇怪,不过我没有BCB,没法试。
先让DoTest什么都不做试试有没有问题
是不是出现地址错误啊,用如下声明试试,我曾经这样使用过:
void __export _stdcall DoTest(void);
我刚上班,公司没有文档资料,没有闲人指教,只有大串的FORM(画出来的),我想也该没有问题的,但它偏偏用的就是不同一般的DLL,我算是看懂了,主要是利用消息返回句柄来实现,函数是公司自己写的。返回的格式是 函数名(自定义的句柄,“某某。DLL”,窗口的消息)
我试了我所能够想到的所有注意事项,仍然不行,
我把dll做成进程内自动化服务器,一切OK,
谢谢大家出了这么多力,结账