:怎么将dll中全局变量传递给应用程序
高手请进:如何将dll中全局变量传递给应用程序?
写了个钩子,需要将hook到的字符串传递给我写的应用程序中,请问该怎么做?
似乎内存映射能解决,但是具体不知道怎么做,请各位高手帮忙。有例程最好。谢谢了。
------解决方案--------------------
首先获得你的程序的实例句柄,然后可以发消息,内存映射,管道等等各种方法
------解决方案--------------------
给你个例子
//获得目录
StrRoot := GetCurrentDir();
if (StrRoot[Length(StrRoot)] <> '\ ')then StrRoot := StrRoot+ '\ ';
StrRoot := StrRoot+ 'HicMemory.tmp ';
//创建文件
FileHandle := CreateFile(PChar(StrRoot),GENERIC_READ or GENERIC_WRITE,FILE_SHARE_WRITE,nil,CREATE_ALWAYS,FILE_ATTRIBUTE_TEMPORARY,handle);
//创建内存空间
FHand := CreateFileMapping(FileHandle,nil,PAGE_READWRITE,0,64*1024,PChar( 'TESTMEMORY '));
//映射
p := MapViewOfFile(FHand,FILE_MAP_WRITE or FILE_MAP_READ,0,0,6400);
//获取内容
QueryFirst.Close ;
QueryFirst.SQL.Clear ;
QueryFirst.SQL.Add( 'select * from di_state order by hicno ');
try
QueryFirst.Open;
except
end;
iout :=0;
Str := ' ';
QueryFirst.First ;
while (not QueryFirst.Eof) do
begin
if iout <> QueryFirst.FieldByName( 'HICNO ').AsInteger then
begin
iData := 0 ;
iout:= QueryFirst.FieldByName( 'HICNO ').AsInteger ;
Str := Str+ '! '+Format( '%.2d ',[iout])+ '00 ';
QuerySec.Close ;
QuerySec.SQL.Clear ;
QuerySec.SQL.Add( 'select * from di_state where hicno= '+IntToStr(iout)+ ' and state=1 order by dino ');
QuerySec.Open;
QuerySec.First ;
while (not QuerySec.Eof) do
begin
iData := iData + Trunc(power(10,(QuerySec.FieldByName( 'dino ').AsInteger -1)));
QuerySec.Next ;
end;
StrTemp := Format( '%.8d ',[idata]);
Str := Str+ StrToBit(StrTemp) + #13#10;
end;
QueryFirst.Next ;
end;
StrPCopy(CharTemp,Str);
//写映射
ApointerMemory(p)^ := CharTemp;
//以下为测试用代码
{ ShowMessage( 'Write: '+#10 + ApointerMemory(p)^);
readHandle := OpenFileMapping(FILE_MAP_READ,false,PChar( 'HICMEMORY '));
readP := MapViewOfFile(readHandle,FILE_MAP_READ,0,0,6400);
ShowMessage( 'read : '+#10 + ApointerMemory(readP)^);
}
------解决方案--------------------
还有这个
http://www.52delphi.com/list.asp?ID=633
------解决方案--------------------
如果变量是Integer这类的发消息就可以了,如果是文本或者结构体,就用共享内存,发消息通知更改。
------解决方案--------------------
写了个钩子,需要将hook到的字符串传递给我写的应用程序中,请问该怎么做?
似乎内存映射能解决,但是具体不知道怎么做,请各位高手帮忙。有例程最好。谢谢了。
------解决方案--------------------
首先获得你的程序的实例句柄,然后可以发消息,内存映射,管道等等各种方法
------解决方案--------------------
给你个例子
//获得目录
StrRoot := GetCurrentDir();
if (StrRoot[Length(StrRoot)] <> '\ ')then StrRoot := StrRoot+ '\ ';
StrRoot := StrRoot+ 'HicMemory.tmp ';
//创建文件
FileHandle := CreateFile(PChar(StrRoot),GENERIC_READ or GENERIC_WRITE,FILE_SHARE_WRITE,nil,CREATE_ALWAYS,FILE_ATTRIBUTE_TEMPORARY,handle);
//创建内存空间
FHand := CreateFileMapping(FileHandle,nil,PAGE_READWRITE,0,64*1024,PChar( 'TESTMEMORY '));
//映射
p := MapViewOfFile(FHand,FILE_MAP_WRITE or FILE_MAP_READ,0,0,6400);
//获取内容
QueryFirst.Close ;
QueryFirst.SQL.Clear ;
QueryFirst.SQL.Add( 'select * from di_state order by hicno ');
try
QueryFirst.Open;
except
end;
iout :=0;
Str := ' ';
QueryFirst.First ;
while (not QueryFirst.Eof) do
begin
if iout <> QueryFirst.FieldByName( 'HICNO ').AsInteger then
begin
iData := 0 ;
iout:= QueryFirst.FieldByName( 'HICNO ').AsInteger ;
Str := Str+ '! '+Format( '%.2d ',[iout])+ '00 ';
QuerySec.Close ;
QuerySec.SQL.Clear ;
QuerySec.SQL.Add( 'select * from di_state where hicno= '+IntToStr(iout)+ ' and state=1 order by dino ');
QuerySec.Open;
QuerySec.First ;
while (not QuerySec.Eof) do
begin
iData := iData + Trunc(power(10,(QuerySec.FieldByName( 'dino ').AsInteger -1)));
QuerySec.Next ;
end;
StrTemp := Format( '%.8d ',[idata]);
Str := Str+ StrToBit(StrTemp) + #13#10;
end;
QueryFirst.Next ;
end;
StrPCopy(CharTemp,Str);
//写映射
ApointerMemory(p)^ := CharTemp;
//以下为测试用代码
{ ShowMessage( 'Write: '+#10 + ApointerMemory(p)^);
readHandle := OpenFileMapping(FILE_MAP_READ,false,PChar( 'HICMEMORY '));
readP := MapViewOfFile(readHandle,FILE_MAP_READ,0,0,6400);
ShowMessage( 'read : '+#10 + ApointerMemory(readP)^);
}
------解决方案--------------------
还有这个
http://www.52delphi.com/list.asp?ID=633
------解决方案--------------------
如果变量是Integer这类的发消息就可以了,如果是文本或者结构体,就用共享内存,发消息通知更改。
------解决方案--------------------