線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1343
推到 Plurk!
推到 Facebook!

在將Delphi的Dll文件導出函數改寫成BCB的問題

尚未結案
afi
一般會員


發表:2
回覆:2
積分:0
註冊:2002-07-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-07 15:10:35 IP:219.140.xxx.xxx 未訂閱
在將Delphi的Dll文件導出函數改寫成BCB的問題 Delphi中這兩句: TShowFrfReport = function(AppHandle: THandle; ReportName: String; dstList: TList{; ProcGetValue: TProcFrGetValue = nil} ): TModalResult; stdcall;    TPrintFrfReport = procedure(AppHandle: THandle; ReportName: String; dstList: TList{; ProcGetValue: TProcFrGetValue = nil} ); stdcall;    改寫成BCB後:    typedef int (FAR PASCAL dllShowFrfReport)(Handle,String,TList); typedef void (FAR PASCAL dllPrintFrfReport)(Handle,String,TList);    編譯時有警告(定位到了上述兩句);但能成功。    但在運行提示: 1.調用dll不成功,提示:不正確指針操作。 2.有時調用dll成功了,但在關閉dll中Form時,整個應用程序崩潰。    ================delphi源文件==================== unit uiPrintFr;    interface    uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, DB;    type    //FastReport的GetValue事件 //TProcFrGetValue = procedure(const ParName: String; var ParValue: Variant) of Object;    TShowFrfReport = function(AppHandle: THandle; ReportName: String; dstList: TList{; ProcGetValue: TProcFrGetValue = nil} ): TModalResult; stdcall;    TPrintFrfReport = procedure(AppHandle: THandle; ReportName: String; dstList: TList{; ProcGetValue: TProcFrGetValue = nil} ); stdcall;    //----------------------------------------------------------------------------//    //預覽dll中的報表 function ShowFrfReport(ReportName: String; dstList: TList{; ProcGetValue: TProcFrGetValue = nil} ): TModalResult; stdcall;    implementation    //提示窗口 procedure WarningBox(sMsg: String); begin MessageBox(0,PChar(sMsg),PChar('提示...'),MB_ICONWARNING OR MB_OK OR MB_TASKMODAL); end;    //預覽dll報表 function ShowFrfReport(ReportName: String; dstList: TList{; ProcGetValue: TProcFrGetValue = nil} ): TModalResult; stdcall; var LibHandle: THandle; FuncLoad : TShowFrfReport; begin LibHandle := LoadLibrary('libPrintFr.dll'); Try If LibHandle=0 then begin WarningBox('無法加載動態鏈接庫:libPrintFr.dll'); Result := mrNone; Exit; end; @FuncLoad := GetProcAddress(LibHandle,'ShowFrfReport'); If @FuncLoad=nil then begin WarningBox('無法加載libPrintFrf.dll中的函數:ShowFrfReport!'); FreeLibrary(LibHandle); Result := mrNone; Exit; end; Result := FuncLoad(Application.Handle,ReportName,dstList); Finally FreeLibrary(LibHandle); End; end;    ================BCB改寫後的源文件================== #include "Windows.h" #include "ShareMem.hpp" #include  #include #include //--------------------------------------------------------------------------- #pragma package(smart_init) typedef int (FAR PASCAL dllShowFrfReport)(Handle,String,TList); typedef void (FAR PASCAL dllPrintFrfReport)(Handle,String,TList); //--------------------------------------------------------------------------- void ShowReport(String ReportName,TList *dstList); void PrintReport(String ReportName,TList *dstList); //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //提示窗口 void WarningBox(String sMsg ) { MessageBox(0,sMsg.c_str(),"提示...",MB_ICONWARNING || MB_OK || MB_TASKMODAL); } //--------------------------------------------------------------------------- //調用dll預覽報表 void ShowReport(String ReportName,TList *dstList) { HINSTANCE hInst; dllShowFrfReport* ShowFrfReport; hInst = LoadLibrary("libPrintFr.dll"); if (hInst!=NULL) { ShowFrfReport= (dllShowFrfReport *)GetProcAddress(hInst,"ShowFrfReport"); if (ShowFrfReport!=NULL) { (*ShowFrfReport)(Application->Handle,ReportName,dstList); } else { WarningBox("無法加載libPrintFrf.dll中的函數:ShowFrfReport!"); } FreeLibrary(hInst); } else WarningBox("無法加載動態鏈接庫:libPrintFr.dll"); =========在主程序中調用========== sFile = sFile "default.frf"; TList *dList =new TList(); dList->Add(DataModule1->ADODataSet1); if (sFile!="\\" || sFile!="") { ShowReport(sFile,dList); //C } else MessageBox(0,"應用程序錯誤!","提示...",MB_ICONWARNING || MB_OK || MB_TASKMODAL); delete dList; 朋友是一种财富!
wyndog
資深會員


發表:7
回覆:362
積分:348
註冊:2004-10-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-07 16:16:47 IP:60.248.xxx.xxx 未訂閱
唔,怎麼 BCB 裡有加 ShareMem Delphi 裡反而沒加 ShareMem?
afi
一般會員


發表:2
回覆:2
積分:0
註冊:2002-07-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-08 13:09:29 IP:219.140.xxx.xxx 未訂閱
ShareMen是多余,去掉之后不影响。 只是其中的TModalResult在BCB中int代替不是那么完整? 关于指针的使用,在delphi不够了解,改写的过程总是不能顺利传递值到dll文件中。 朋友是一种财富!
wyndog
資深會員


發表:7
回覆:362
積分:348
註冊:2004-10-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-08 13:56:54 IP:60.248.xxx.xxx 未訂閱
嗯,因為你在 Delphi 的那個 DLL 中 用到 string 當參數,就一定得用 ShareMem 了 而且,你那些錯誤,都非常像是 ShareMem 沒用好的關係... 我比較建議用 PChar 傳,不要用 string 傳
系統時間:2024-05-03 15:18:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!