|
|
@@ -1,139 +0,0 @@
|
|
|
-This patch adds 'loadwithalteredsearchpath' support to the SVN rev 1045 sources.
|
|
|
-
|
|
|
-diff -ur 1045/Source/uPSC_dll.pas 1045a/Source/uPSC_dll.pas
|
|
|
---- 1045/Source/uPSC_dll.pas Fri Jan 14 10:52:59 2005
|
|
|
-+++ 1045a/Source/uPSC_dll.pas Sun Sep 16 01:36:36 2007
|
|
|
-@@ -40,12 +40,13 @@
|
|
|
- function DllExternalProc(Sender: TPSPascalCompiler; Decl: TPSParametersDecl; const Name, FExternal: string): TPSRegProc;
|
|
|
- var
|
|
|
- FuncName,
|
|
|
-- FuncCC, s: string;
|
|
|
-+ FuncCC, s, s2: string;
|
|
|
- CC: TDllCallingConvention;
|
|
|
-- DelayLoad: Boolean;
|
|
|
-+ DelayLoad, LoadWithAlteredSearchPath: Boolean;
|
|
|
-
|
|
|
- begin
|
|
|
- DelayLoad := False;
|
|
|
-+ LoadWithAlteredSearchPath := False;
|
|
|
- FuncCC := FExternal;
|
|
|
- if (pos('@', FuncCC) = 0) then
|
|
|
- begin
|
|
|
-@@ -63,15 +64,28 @@
|
|
|
- begin
|
|
|
- s := Copy(FuncCC, pos(' ', Funccc)+1, MaxInt);
|
|
|
- FuncCC := FastUpperCase(Copy(FuncCC, 1, pos(' ', FuncCC)-1));
|
|
|
-- Delete(FuncCC, pos(' ', Funccc), MaxInt);
|
|
|
-- if FastUppercase(s) = 'DELAYLOAD' then
|
|
|
-- DelayLoad := True
|
|
|
-- else
|
|
|
-- begin
|
|
|
-- Sender.MakeError('', ecCustomError, 'Invalid External');
|
|
|
-- Result := nil;
|
|
|
-- exit;
|
|
|
-- end;
|
|
|
-+ repeat
|
|
|
-+ if pos(' ', s) > 0 then begin
|
|
|
-+ s2 := Copy(s, 1, pos(' ', s)-1);
|
|
|
-+ delete(s, 1, pos(' ', s));
|
|
|
-+ end else begin
|
|
|
-+ s2 := s;
|
|
|
-+ s := '';
|
|
|
-+ end;
|
|
|
-+ if FastUppercase(s2) = 'DELAYLOAD' then
|
|
|
-+ DelayLoad := True
|
|
|
-+ {$IFNDEF LINUX}
|
|
|
-+ else
|
|
|
-+ if FastUppercase(s2) = 'LOADWITHALTEREDSEARCHPATH' then
|
|
|
-+ LoadWithAlteredSearchPath := True
|
|
|
-+ {$ENDIF}
|
|
|
-+ else
|
|
|
-+ begin
|
|
|
-+ Sender.MakeError('', ecCustomError, 'Invalid External');
|
|
|
-+ Result := nil;
|
|
|
-+ exit;
|
|
|
-+ end;
|
|
|
-+ until s = '';
|
|
|
- end else
|
|
|
- FuncCC := FastUpperCase(FuncCC);
|
|
|
- if FuncCC = 'STDCALL' then cc := ClStdCall else
|
|
|
-@@ -89,7 +103,7 @@
|
|
|
- FuncCC := '';
|
|
|
- cc := DefaultCC;
|
|
|
- end;
|
|
|
-- FuncName := 'dll:'+FuncName+char(cc)+char(bytebool(DelayLoad)) + declToBits(Decl);
|
|
|
-+ FuncName := 'dll:'+FuncName+char(cc)+char(bytebool(DelayLoad))+char(bytebool(LoadWithAlteredSearchPath)) + declToBits(Decl);
|
|
|
- Result := TPSRegProc.Create;
|
|
|
- Result.ImportDecl := FuncName;
|
|
|
- Result.Decl.Assign(Decl);
|
|
|
-diff -ur 1045/Source/uPSR_dll.pas 1045a/Source/uPSR_dll.pas
|
|
|
---- 1045/Source/uPSR_dll.pas Sat Jan 15 17:29:32 2005
|
|
|
-+++ 1045a/Source/uPSR_dll.pas Sun Sep 16 01:36:36 2007
|
|
|
-@@ -24,7 +24,7 @@
|
|
|
- {
|
|
|
- p^.Ext1 contains the pointer to the Proc function
|
|
|
- p^.ExportDecl:
|
|
|
-- 'dll:'+DllName+#0+FunctionName+#0+chr(Cc)+Chr(DelayLoad)+VarParams
|
|
|
-+ 'dll:'+DllName+#0+FunctionName+#0+chr(Cc)+Chr(DelayLoad)+Chr(AlternateSearchPath)+VarParams
|
|
|
- }
|
|
|
-
|
|
|
- type
|
|
|
-@@ -83,7 +83,7 @@
|
|
|
-
|
|
|
- function LoadDll(Caller: TPSExec; P: TPSExternalProcRec): Boolean;
|
|
|
- var
|
|
|
-- s, s2: string;
|
|
|
-+ s, s2, s3: string;
|
|
|
- h, i: Longint;
|
|
|
- ph: PLoadedDll;
|
|
|
- {$IFDEF LINUX}
|
|
|
-@@ -91,12 +91,16 @@
|
|
|
- {$ELSE}
|
|
|
- dllhandle: THandle;
|
|
|
- {$ENDIF}
|
|
|
-+ loadwithalteredsearchpath: Boolean;
|
|
|
- begin
|
|
|
- s := p.Decl;
|
|
|
- Delete(s, 1, 4);
|
|
|
- s2 := copy(s, 1, pos(#0, s)-1);
|
|
|
- delete(s, 1, length(s2)+1);
|
|
|
- h := makehash(s2);
|
|
|
-+ s3 := copy(s, 1, pos(#0, s)-1);
|
|
|
-+ delete(s, 1, length(s3)+1);
|
|
|
-+ loadwithalteredsearchpath := bytebool(s[3]);
|
|
|
- i := 2147483647; // maxint
|
|
|
- dllhandle := 0;
|
|
|
- repeat
|
|
|
-@@ -113,7 +117,10 @@
|
|
|
- {$IFDEF LINUX}
|
|
|
- dllhandle := dlopen(PChar(s2), RTLD_LAZY);
|
|
|
- {$ELSE}
|
|
|
-- dllhandle := LoadLibrary(Pchar(s2));
|
|
|
-+ if loadwithalteredsearchpath then
|
|
|
-+ dllhandle := LoadLibraryEx(Pchar(s2), 0, LOAD_WITH_ALTERED_SEARCH_PATH)
|
|
|
-+ else
|
|
|
-+ dllhandle := LoadLibrary(Pchar(s2));
|
|
|
- {$ENDIF}
|
|
|
- if dllhandle = {$IFDEF LINUX}nil{$ELSE}0{$ENDIF}then
|
|
|
- begin
|
|
|
-@@ -133,9 +140,9 @@
|
|
|
- end;
|
|
|
- until dllhandle <> {$IFDEF LINUX}nil{$ELSE}0{$ENDIF};
|
|
|
- {$IFDEF LINUX}
|
|
|
-- p.Ext1 := dlsym(dllhandle, pchar(copy(s, 1, pos(#0, s)-1)));
|
|
|
-+ p.Ext1 := dlsym(dllhandle, pchar(s3));
|
|
|
- {$ELSE}
|
|
|
-- p.Ext1 := GetProcAddress(dllhandle, pchar(copy(s, 1, pos(#0, s)-1)));
|
|
|
-+ p.Ext1 := GetProcAddress(dllhandle, pchar(s3));
|
|
|
- {$ENDIF}
|
|
|
- if p.Ext1 = nil then
|
|
|
- begin
|
|
|
-@@ -179,7 +186,7 @@
|
|
|
- exit;
|
|
|
- end;
|
|
|
- cc := TPSCallingConvention(s[1]);
|
|
|
-- delete(s, 1, 2); // cc + delayload (delayload might also be forced!)
|
|
|
-+ delete(s, 1, 3); // cc + delayload + alternatesearchpath (delayload might also be forced!)
|
|
|
- CurrStack := Cardinal(Stack.Count) - Cardinal(length(s));
|
|
|
- if s[1] = #0 then inc(CurrStack);
|
|
|
- MyList := tIfList.Create;
|