Autor Beitrag
gsmgrufti
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 22


Delphi 7 Prof, BDS2006 rof
BeitragVerfasst: Do 18.10.07 22:03 
Hallo zusammen,
folgendes Problem in Stichworten:
- Fremdprogramm (TV-Prog) bietet API-Schnittstelle
- eine bereits von mir programmierte DLL dazu funktioniert perfekt mit den entsprechenden API-Calls
- nun möchte ich auch von einer Standalone-App diese Calls durchführen und die Rückgabewerte verarbeiten.
- das finden des HWND ist kein Problem ->geht und ist überprüft auf "Gleichheit" zur DLL
- wenn ich aber via Sendmessage dann die selbe Routine wie in der DLL anstossen möchte, krieg ich nix zurück, bzw. geht.

Hab ich da einen Denkfehler, bzw. kann ich mich einer in die richtige Richtung schubsen ?


P.S:
Crossposting : forum.dsdt.info/viewtopic.php?t=34525
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 19.10.07 08:47 

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 19.10.07 08:49 
Ohne Beispielcode aus der DLL und deiner nicht funktionierenden Anwendung werden sich nur die Seher und professionellen Medien unter uns in der Lage sehen, Dir zu helfen. Naturgemäß sind Menschen mit übersinnlichen Fähigkeiten dieser Art selten Softwareentwickler, obwohl das von Vorteil wäre, vor allen Dingen dann, wenn da man Bugs sieht, bevor sie gecodet werden.

Also: Rück mal ein wenig Code raus :mrgreen:

_________________
Na denn, dann. Bis dann, denn.
gsmgrufti Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 22


Delphi 7 Prof, BDS2006 rof
BeitragVerfasst: Fr 19.10.07 16:32 
Also, DLL-Auszug, geht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
const
 WTVP_GET_CHANNELFILE_NAME  = $01021140;
type
 c_string = array of char;
 CHANNELFILE_INFO = record
                      pDestination  : c_string;
                      iSize         : integer;
                    end;
var
 ChannelFilename: CHANNELFILE_INFO;

procedure Read_Channel_Filename;Cdecl;
begin
  SetLength(ChannelFilename.pDestination,4096);
  ChannelFilename.iSize:=Length(ChannelFilename.pDestination);
  SendMessage(appwindow, WM_USER, WTVP_GET_CHANNELFILE_NAME, longword(@ChannelFilename));
  Filename:=Trim(string(ChannelFilename.pDestination));
end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function TMainform.WTVP_getChnFilename(WTV_HWND:hwnd): string;
type
 c_string = array of char;
 CHANNELFILE_INFO = record
                      pDestination  : c_string;
                      iSize         : integer;
                    end;
var ChannelFilename: CHANNELFILE_INFO;

begin
  SetLength(ChannelFilename.pDestination,4096);
  ChannelFilename.iSize:=Length(ChannelFilename.pDestination);
  SendMessage(WTV_HWND, WM_USER, WTVP_GET_CHANNELFILE_NAME, longword(@ChannelFilename));
  result:=Trim(string(ChannelFilename.pDestination));
end;

WTV_HWND wird via Enumwindows ... geholt -> spar ich mir hier, da ich das vergleichen kann und exakt übereinstimmt
Stefan.Buchholtz
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 612

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: Fr 19.10.07 16:56 
Meiner Meinung liegt es daran, dass die DLL im gleichen Prozessraum wie das zu steuernde Programm läuft und das separate Programm natürlich nicht. Deswegen kann die DLL mit dem Programm Daten über einen Zeiger austauschen, den du über die Window-Message mitteilst (@ChannelFilename). Ein separates Programm arbeitet in einem eigenen virtuellen Speicherbereich und der durch die Window-Message übergebene Zeiger ist nicht gültig.

Ich sehe da im Moment auch keinen Workaround, der nicht die Kooperation des zu steuernden Programms voraussetzt, z.B. via Shared Memory. Du könntest höchstens eine DLL bauen, die die Plugin-Schnittstelle bedient und mit deinem separatem Programm auf eine andere Art kommuniziert.

Stefan

_________________
Ein Computer ohne Windows ist wie eine Schokoladentorte ohne Senf.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 19.10.07 16:59 
Oho, sieht ok aus, auf den ersten Blick. Aaaaaber: Du übergibst einer fremden Anwendung einen Zeiger auf Speicher deiner eigenen Anwendung. Das kann eigentlich gar nicht funktionieren. Daher frage ich mich, in wessen Adressraum die DLL läuft? Daten zwischen Anwendungen austauschen geht eigentlich nur über WM_COPYDATA, oder allgemeiner, mit IPC (siehe Link oben)...

_________________
Na denn, dann. Bis dann, denn.