Hallo,<br>
<br><pre>
die dll
type
PhlTCPClient = ^ThlTCPClient;
ThlTCPClient = class(TIdTCPClient)
private
FThreadId : Cardinal;
public
property ThreadId: Cardinal read FThreadID write FThreadID;
end;
TTaskList = array[0..MaxListSize - 1] of ThlTCPClient;
<br>
function CreateClient:Pointer; stdcall;
var i,ir: Integer;
begin
Result := nil;
Lock;
try
ir := -1;
for i := 0 to TaskCount-1 do begin
if TaskList[i].ThreadId = GetCurrentThreadId then begin
ir := i;
break;
end;
end;
if ir = -1 then begin
Result := @TaskList[TaskCount];
Inc(TaskCount);
ThlTCPClient(Result^) := ThlTCPClient.Create(nil);
ThlTCPClient(Result^).ThreadId := GetCurrentThreadId;
end;
finally
UnLock;
end;
end;
function Connect(const pcHost: PChar;const Port:Integer;const TimeOut:Integer = -1):Boolean; stdcall;
var i: Integer;
p: PhlTCPClient;
begin
Result := False;
Lock;
try;
p := nil;
for i := 0 to TaskCount-1 do begin
if TaskList[i].ThreadId = GetCurrentThreadId then begin
p := @TaskList[i];
break;
end;
end;
finally
Unlock;
end;
if p <> nil then begin
ThlTCPClient(p^).hlHost := pcHost;
ThlTCPClient(p^).Port := Port;
ThlTCPClient(p^).Connect(TimeOut);
Result := ThlTCPClient(p^).Connected;
end;
end;
function ConnectEx(const p:Pointer;const pcHost: PChar;const Port:Integer;const TimeOut:Integer = -1):Boolean; stdcall;
begin
Result := False;
if p <> nil then begin
ThlTCPClient(p^).hlHost := pcHost;
ThlTCPClient(p^).Port := Port;
ThlTCPClient(p^).Connect(TimeOut);
Result := ThlTCPClient(p^).Connected;
end;
end;
...
</pre>
zu Ziel: eine Dll auf die mehre Threads zugreifen ohne sich gegenseitig zu stören(auf anderen warten), sprich auser Create zu beispiel gleichzeitig Daten senden.
Und deshalb eine Dll das sich Indy oft ändert.
Ich möchte nur die DLL tauschen.
<br>
<br>
das Problem: wenn ich die DLL ohne "ShareMem" mache kommt es zu mekrwürdigen fehler Meldungen.<br>
<br>
M.f.G. H. Leesch
<br><pre>
die dll
type
PhlTCPClient = ^ThlTCPClient;
ThlTCPClient = class(TIdTCPClient)
private
FThreadId : Cardinal;
public
property ThreadId: Cardinal read FThreadID write FThreadID;
end;
TTaskList = array[0..MaxListSize - 1] of ThlTCPClient;
<br>
function CreateClient:Pointer; stdcall;
var i,ir: Integer;
begin
Result := nil;
Lock;
try
ir := -1;
for i := 0 to TaskCount-1 do begin
if TaskList[i].ThreadId = GetCurrentThreadId then begin
ir := i;
break;
end;
end;
if ir = -1 then begin
Result := @TaskList[TaskCount];
Inc(TaskCount);
ThlTCPClient(Result^) := ThlTCPClient.Create(nil);
ThlTCPClient(Result^).ThreadId := GetCurrentThreadId;
end;
finally
UnLock;
end;
end;
function Connect(const pcHost: PChar;const Port:Integer;const TimeOut:Integer = -1):Boolean; stdcall;
var i: Integer;
p: PhlTCPClient;
begin
Result := False;
Lock;
try;
p := nil;
for i := 0 to TaskCount-1 do begin
if TaskList[i].ThreadId = GetCurrentThreadId then begin
p := @TaskList[i];
break;
end;
end;
finally
Unlock;
end;
if p <> nil then begin
ThlTCPClient(p^).hlHost := pcHost;
ThlTCPClient(p^).Port := Port;
ThlTCPClient(p^).Connect(TimeOut);
Result := ThlTCPClient(p^).Connected;
end;
end;
function ConnectEx(const p:Pointer;const pcHost: PChar;const Port:Integer;const TimeOut:Integer = -1):Boolean; stdcall;
begin
Result := False;
if p <> nil then begin
ThlTCPClient(p^).hlHost := pcHost;
ThlTCPClient(p^).Port := Port;
ThlTCPClient(p^).Connect(TimeOut);
Result := ThlTCPClient(p^).Connected;
end;
end;
...
</pre>
zu Ziel: eine Dll auf die mehre Threads zugreifen ohne sich gegenseitig zu stören(auf anderen warten), sprich auser Create zu beispiel gleichzeitig Daten senden.
Und deshalb eine Dll das sich Indy oft ändert.
Ich möchte nur die DLL tauschen.
<br>
<br>
das Problem: wenn ich die DLL ohne "ShareMem" mache kommt es zu mekrwürdigen fehler Meldungen.<br>
<br>
M.f.G. H. Leesch
Comment