在中、日操作系统下用DLL封装窗体、相同代码在日文下报错……
系统介绍:
1.中文 XP SP3
2.日文 XP SP3
代码如下:
==========================DLL==========================
==========================调用==========================
DPR文件
uses sharemem
在中文下编译、运行没问题,编译后的文件拿到日文下、运行没问题。
如果在日文下,编译使用相同代码后,宿主程序在呼出DLL窗体时也没问题。
但是,当DLL窗体关闭后,再关闭宿主程序,delphi就会报内存错误和runtime error
这是为什么捏?
在此BS下日文系统- -
1.中文 XP SP3
2.日文 XP SP3
代码如下:
==========================DLL==========================
uses
Sharemem,
SysUtils,
Forms,
Messages,
Windows,
Classes,
ActiveX,
comObj,
untPRJ_1_Setup in 'untPRJ_1_Setup.pas' {frmPRJ_1_Setup},
udmData in '..\Common\udmData.pas' {dmData: TDataModule},
untCommon in '..\Common\untCommon.pas',
AES in '..\Common\AES.pas',
ElAES in '..\Common\ElAES.pas';
{$R *.res}
var
DllApp: TApplication;
DLLScreen: TScreen;
TheForm: TForm;
TheClass: TPersistentClass;
procedure RunDLL(DLLName, FormName, FormCaption: string;
APP: TApplication; SC: TScreen) stdcall;
begin
Application := App;
Screen := SC;
RegisterClasses([TfrmPRJ_1_Setup]);
TheClass := GetClass('T' + FormName);
if (TheClass <> nil) and TheClass.InheritsFrom(TForm) then
begin
TheForm := TForm(TheClass.Create).Create(Application);
//TheForm := TfrmPRJ_1_Setup.Create(Application, FormCaption);
//TheForm.Show;
try
TheForm.ShowModal;
finally
FreeAndNil(TheForm);
//TheForm.Free;
end;
end;
end;
procedure DLLUnloadProc(dwReason: Dword);
begin
case dwReason of
//DLL_PROCESS_ATTACH, DLL_THREAD_ATTACH:
//CoInitialize(nil);
DLL_PROCESS_DETACH:
begin
//CoUninitialize;
Application := DLLApp;
Screen := DLLScreen;
if TheForm <> nil then
FreeAndNil(TheForm);
SendMessage(Application.Handle, WM_CLOSE, 0, 0);
FreeLibrary(Application.Handle);
end;
DLL_THREAD_DETACH:
//CoUninitialize;
end;
end;
exports
RunDLL;
begin
DLLApp := Application;
DLLScreen := Screen;
DLLProc := @DLLUnloadProc;
DLLUnloadProc(DLL_PROCESS_ATTACH);
end.
==========================调用==========================
DPR文件
uses sharemem
type
TRunDLL = procedure(DLLName, FormName, FormCaption: string;
Application: TApplication; Screen: TScreen); stdcall;
procedure TfrmMain.btnPRJ_1_SetupClick(Sender: TObject);
begin
RunDLLForm('PRJ_1_Setup.dll', 'frmPRJ_1_Setup', 'ノ靹テ', Application, Screen);
end;
procedure TfrmMain.RunDLLForm(DLLName, FormName, FormCaption: string;
APP: TApplication; SC: TScreen) stdcall;
var
GetDllHWND: HWND;
RunDLL: TRunDLL;
begin
GetDllHWND := LoadLibrary(PChar(DllName));
if GetDllHWND = 0 then
begin
MessageBox(0, PChar('テサモミユメオステ鉸ェ '+DLLName+' オトホトシ」ャヌ・キネマウフミヌキ・訒。'),
'シモヤリDLLホトシハァーワ', MB_OK);
Exit;
end;
try
@RunDLL := GetProcAddress(GetDllHWND, 'RunDLL');
if Assigned(@RunDLL) then
begin
try
RunDLL(UpperCase(Trim(DLLName)), UpperCase(Trim(FormName)),
FormCaption, APP, SC);
except
raise Exception.Create('T' + FormName + 'イサエ贇レ」。');
end;
end;
finally
FreeLibrary(GetDllHWND);
end;
end;
在中文下编译、运行没问题,编译后的文件拿到日文下、运行没问题。
如果在日文下,编译使用相同代码后,宿主程序在呼出DLL窗体时也没问题。
但是,当DLL窗体关闭后,再关闭宿主程序,delphi就会报内存错误和runtime error
这是为什么捏?
在此BS下日文系统- -
...全文


