[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1192
  • Last Modified:

How to use the SendMessageTimeOut function ?

Hello !
In my code I make modifications in the registry.
After those modifications I have to notify all others applications of those changes by broadcasting the WM_WININICHANGE message.
Under win95 I have to use the SendMessageTimeOut function.
The SDK give this example :
SendMessageTimeOut(HWND_BROADCAST,WM_WININICHANGE,0,0L,(LPARAM)(LPCTSTR)"windows",SMTO_NORMAL,1000,NULL);
But it doesn't work !
Does anybody know how to use this function ?
If you have some examples, it will be great !
Thanks in advance.
0
nk51
Asked:
nk51
  • 6
  • 4
1 Solution
 
MadshiCommented:
Hmmm. I don't think, you can use SendMessage or SendMessageTimeout to send broadcast messages. Don't know why it stands in the SDK.
Please try to use "PostMessage(HWND_BROADCAST,WM_WININICHANGE,...)".

Regards, Madshi.
0
 
MadshiCommented:
P.S: Try

(1) PostMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,lparam(pointer('Windows')));
or
(2) PostMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);

WM_WININICHANGE is obsolete.
0
 
nk51Author Commented:
if I use :
PostMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,lparam(pointer('Windows')));
the compilation return the message :
"incorrect cast"
if I use :
PostMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);
the compilation is OK but it doesn't work :
all others applications aren't notify about the changes I made in the registry.
Have you an explication about the compilation error ?
thanks.
0
The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

 
MadshiCommented:
nk51,

I looked again at the documentation. I'm sorry. The SDK is right. I was wrong...   :-(
Now here comes the working solution:

procedure TForm1.Button1Click(Sender: TObject);
var s1 : string;
    c1 : cardinal;
begin
  s1:='windows';
  SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,0,integer(pointer(s1)),SMTO_NORMAL,1000,c1);
end;

Regards, Madshi.

P.S: This works with Delphi4. If you have Delphi3 or lower, perhaps you have to change "c1: cardinal" to "c1: integer".
0
 
nk51Author Commented:
You're answer seems to be good but the SendMessageTimeout function erase the modification I made in the registry and restore the previous value.
Have you an idea about what's happening ?

My code :

procedure TForm1.Button3Click(Sender: TObject);
var s1 : string;
    c1 : integer;
begin
   //Modification de la registry
   Imprimante := TStringList.Create;
   RegImprimante := TRegistry.Create;
   RegImprimante.RootKey := HKEY_LOCAL_MACHINE;
   if RegImprimante.OpenKey('Config\0001\System\CurrentControlSet\Control\Print\Printers',False)
   then
   begin
      RegImprimante.WriteString('Default','Tertiaire');
      RegImprimante.LazyWrite := False;
      RegImprimante.CloseKey;
   end;
   RegImprimante.free;

   s1:='windows';
   SendMessageTimeout(HWND_BROADCAST,WM_WININICHANGE,0,integer(pointer(s1)),SMTO_NORMAL,1000,c1);

end;
0
 
MadshiCommented:
Try

WritePrivateProfileString('windows','device','Tertiaire,driver,LPT1:','win.ini');

This seems to be one of the cases where the win.ini settings dominate the registry settings...

Regards, Madshi.
0
 
nk51Author Commented:
Your answer is excellent.
But to use the WritePrivateProfileString function, I need to know the driver and the port of the printer I want to put as default.
So I use the GetPrivateProfileString function to retrieve those parameters. But I have a problem of Access violation because of the PChar I use. Have you an idea about this problem ?

Thanks.

My code :

function TForm1.PrinterParams : string;
var
   buffer : pChar;
begin

    GetPrivateProfileString('devices','Tertiaire','',buffer,sizeof(buffer),'win.ini');
    result := buffer;

end;
0
 
MadshiCommented:
Your "buffer" is only a pointer to a non-defined memory address. So what happens is: Windows writes 4 bytes (sizeOf(pointer)=4) to a non-defined memory address.
You can either allocate (and then of course free) a pchar using GetMem/FreeMem.
Or you can use "my" method:

begin
  SetLength(result,MAX_PATH);
  GetPrivateProfileString('devices','Tertiaire','',pchar(result),MAX_PATH,'win.ini');
  result:=string(pchar(result));  // This line shortens the string by looking at the #0 char...
end;

Regards, Madshi.
0
 
nk51Author Commented:
Thank, you're great Madshi !
0
 
MadshiCommented:
No problem...  :-)
0

Featured Post

Take Control of Web Hosting For Your Clients

As a web developer or IT admin, successfully managing multiple client accounts can be challenging. In this webinar we will look at the tools provided by Media Temple and Plesk to make managing your clients’ hosting easier.

  • 6
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now