也许有一些我错过的东西,我无法想象这里发生了什么.
我正在尝试在TThread对象的多个实例中加载相同的DLL.
这是我的DLL代码:
library MyCalcFor32; uses SysUtils, Classes, uRunner in 'uRunner.pas'; Exports EVal; {$R *.res} begin end.
这是uRunner.pas:
unit uRunner; interface uses SysUtils, Classes; function EVal(Valor: WideString): WideString; stdcall; export; implementation function EVal(Value: WideString): WideString; stdcall; export; begin Result := Value+' xxx'; end; initialization finalization end.
这是加载DLL的程序:
procedure TfrmMain.FormCreate(Sender: TObject); var I: Integer; begin SetLength(Threads, 10); for I:= 0 to 9 do begin Threads[I] := TWorker.Create(Self.Handle, I+1, Memo1.Text, ExtractFilePath(ParamStr(0))); end; end; procedure TfrmMain.btnExecuteThreadsClick(Sender: TObject); var I: Integer; begin ClearMemos([MT1, MT2, MT3, MT4, MT5, MT6, MT7, MT8, MT9, MT10]); for I:= 0 to 0 do //to 9, for multiple begin if Threads[I].Suspended then Threads[I].Resume else ShowMessage('Thread already in execution'); end; end; procedure TWorker.Execute; var I: Integer; J: Cardinal; Ret: WideString; A,B,C: Extended; begin CoInitialize(nil); try LoadDll; while not Terminated do begin if not (Suspended or Terminated) then begin A := 310132041025; B := 17592186044416; C := 0; for I:= 0 to 10 do begin if (Terminated) then begin Break; end; for J:= 0 to 9999999 do begin if (Terminated) then begin Break; end; A:= Sqrt(A); if A <= 0 then begin A:= 310132041025; end else begin A:= Math.Power(A, 2); end; C:= C + (B-34 / 4); B:= B / 2; if B <= 0 then begin B:= 17592186044416; end; end; Ret := FEvalProcAddress(FEValValue); NotifyMainForm(Format('Evaluate %s, resulted in %s', [IntToStr(I), Ret])); end; Suspend; end; Sleep(5000); end; finally CoUninitialize; end; end; procedure TWorker.LoadDll; begin //GlobalLock.Enter; //try FDLLHandle := LoadLibraryA(PChar(FPathApp + 'MyCalcFor32.dll')); //finally // GlobalLock.Leave; //end; if GetLastError <> 0 then begin NotifyTerminateThread; end else begin FEvalProcAddress := GetProcAddress(FDLLHandle, PChar('EVal')); if GetLastError <> 0 then begin NotifyTerminateThread; end; end; end;
当我只有一个线程时,它工作得很好,但是当我使用多个线程时它会引发以下异常:
System Error. Code: 87. Incorrect Parameter
注意:上面的代码仅用于复制;
我知道WideString + AnsiString问题.