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,
謝謝大家出了這么多力,結賬