如何在两个进程间通过dll传递信息?(15分)

  • 主题发起人 主题发起人 esri
  • 开始时间 开始时间
E

esri

Unregistered / Unconfirmed
GUEST, unregistred user!
我用delphi写了一个程序,这个程序要调用判断log.dll是否登陆,如果登陆就继续运行
否则就停止,我的同事用vb写的程序要先调用这个log.dll.然后给出是否让登陆的信息。
log.dll中的函数有getland() boolean 返回是否登陆。
getid().......
我写的用静态调用,为什么明明登陆了还是不能运行我的程序?
 
静态调用:
function GolayCode(lpBuffer: PChar; uSize: UINT; Result: PChar): UINT; stdcall; external 'code_dll.dll'
程序中直接调用该函数即可。
动态调用:
procedure TForm1.Button1Click(Sender: TObject);
//const cc:array[0..4]of byte=($1,$2,$3,$4,$5);
var
//buffer: pchar;
data, result: array[0..512]of char;
h : HInst;
fn, fn2 : function (lpBuffer: PChar; uSize: UINT; Result: PChar): UINT; stdcall;
pn: procedure;stdcall;
//fs:LPCSTR;
c_len, d_len, i: integer;
s, s2: string;
begin

h:=LoadLibrary('code_dll.dll');
if h=0 then
begin
showMessage('load library error!');
exit;
end;
@fn := GetProcAddress(h,Pchar('golay_code'));
@fn2 := GetProcAddress(h,Pchar('golay_decode'));
@pn := GetProcAddress(h,Pchar('generate_golay_table'));
if (@fn=nil)or(@pn=nil) then
begin
showMessage('get proc address error!');
freelibrary(h);
exit;
end;

data := '12345';
//getmem(buffer,512);
pn;
c_len := fn(data,5,result);
d_len := fn2(result,c_len,data);

s := '';
for i:=0 to c_len-1 do
s := s+ format('%x/',[ord(result)]);
//caption := s;

s2 := '';
for i:=0 to d_len-1 do
s2 := s2+ format('%x/',[ord(data)]);
ShowMessage('golay_code:'+s+#13+'golay_decode:'+s2);

freelibrary(h);

end;
注册表,举个例子:
uses Registry;

procedure TMainForm.FormCreate(Sender: TObject);
var myreg : treginifile;
dbname,vodkey:string;
c:array[0..MAX_PATH]of char;
begin

//得到windows目录
GetWindowsDirectory(c,sizeof(c));
WinDir:=strpas(c);

//得到 程序所在目录
MyDir:= ExtractFilePath(ParamStr(0));

myreg := treginifile.create;
myreg.rootkey := HKEY_LOCAL_MACHINE;
vodkey:='Software/VOD';
DataBase1.Connected := false;
if not myreg.KeyExists(vodkey) then
begin
OpenDlg1.Title := '请选择数据库文件';
if OpenDlg1.Execute then DBname:=OpenDlg1.FileName; //选择数据库文件
if trim(DBname)='' then close;
myreg.WriteString('Software/VOD','DBname',DBname);
DataBase1.DatabaseName := DBname;
end
else
begin
DBname:= myreg.readString(vodkey,'DBname','invalid');
if DBname<>'invalid' then DataBase1.DatabaseName := DBname;
end;
DataBase1.Connected := true;

end;
 
进程间通信不一定要dll,用消息也可以的
 
我就是用的动态调用的方法。
先loadlibrary(log.dll)
然后判断getland
if getland then freelibrary
else
begin showmessage('你没有登陆');
application.terminate;
end;
问题是我的同事先调用然后将getland置成true哈。
他明明登陆了,为什么每次都是提示没有登陆;
是不是我们调用的不是一个dll?
 
请帮助我
 
在 32位 windows上,每一个程序都运行在自己的空间中,加载的dll
也相应的在不同的地址空间。
你如果希望多个程序使用一个公共的标志变量,可以通过CreateFileMapping
OpenFileMapping,MapViewOfFileEx
等函数,创建一个公共内存区,将这个变量放在其中。
 
southwood的方法可以。
在《C++ Builder 5编程实例与技巧》中有使用方法。
 
最好用全局原子啊,
 
谁能给一个实例?
 
多人接受答案了。
 
后退
顶部