Code works in Delphi 7 but not in Delphi 2010 [Edit]

hello,
i have a procedure that open's a file by passing the file name as the parameter to the executable.
something like this

{code}
  C : \ P r o g r a m   F i l e s \ Da c k e r \ D r a c k e r . e x e   " G : \ D E l p h i   7 \ D e l p h i 7 A p p _ l o g . t "
{code}

The source code is 

{code}
     procedure OpenFileWithExe
var
  hReg: HKEY;
  Ret: Longint;
  RegDataType, RegDataSize: DWORD;
  CmdLine: array [0..560] of Char;
  Len: Integer;
  SInfo: TStartupInfo;
  PInfo: TProcessInformation;
begin
  Ret := windows.RegOpenKeyEx(HKEY_CURRENT_USER,
                  'SOFTWARE\Dracker',
                  0, KEY_READ, hReg);

  RegDataType := REG_SZ;
  RegDataSize := 260;
  Ret := windows.RegQueryValueEx(hReg,'Installation_path',nil, @RegDataType, @CmdLine, @RegDataSize);
  RegCloseKey(hReg);

  CmdLine[RegDataSize - 1] := ' ';
  CmdLine[RegDataSize] := '"';    
  Len := windows.GetModuleFileName(0,PChar(@CmdLine[RegDataSize + 1]), 260) + RegDataSize;

  while CmdLine[Len] <> '.' do    
    Dec(Len);
  CmdLine[Len] := #0;
  lstrcat(CmdLine, '_file_leak_log.umlt"'#0); 

  ZeroMemory(@SInfo, SizeOf(SInfo));
  SInfo.cb := SizeOf(SInfo);
  CreateProcess(nil, CmdLine, nil, nil, False,NORMAL_PRIORITY_CLASS, nil, nil, sInfo, pInfo);

end;

{code}

This works fine in delphi 7. the code open the exe with the file path/name as the paramter but the same code doesnt work in Delphi 2010


in Dlephi 2010 the the value of CmdLine is 
{code}
(C : \ P r o g r a m   F i l e s \ D a c k e r \ D a c k e r . e x e __ l o g . t " #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 

#0 #0 #0 #0   " G : \ D E l p h i   2 0 1 0 \ D e l p h i 2 0 1 0 A p p #0 e x e
{code}

i guess the 
{code}
  windows.GetModuleFileName
{code}
is not getting the exe  directory?

Edited by: Presley Dias on Jul 19, 2012 6:00 AM

Edited by: Presley Dias on Aug 30, 2012 6:03 AM
0
Presley
8/30/2012 1:04:39 PM
embarcadero.delphi.non-tech 5933 articles. 1 followers. Follow

7 Replies
1739 Views

Similar Articles

[PageSpeed] 4

Try with Widechar and PWidechar with the lines below.

{code}
CmdLine: array [0..560] of Char;
{code}

and

{code}
Len := windows.GetModuleFileName(0,PChar(@CmdLine[RegDataSize + 1]),
60)+ RegDataSize;
{code}
0
Adem
7/19/2012 2:41:40 PM
Adem wrote:

> Len := windows.GetModuleFileName(0,PChar(@CmdLine[RegDataSize + 1]),
> 60)+ RegDataSize;

RegDataSize is expressed in bytes, not in Chars.  SizeOf(WideChar) is 2, 
so you need to account for that.

--
Remy Lebeau (TeamB)
0
Remy
7/19/2012 4:40:19 PM
Presley wrote:

> This works fine in delphi 7. the code open the exe with the file
> path/name as the paramter but the same code doesnt work in Delphi 2010

That is because Char mapped to AnsiChar in D7 but now maps to WideChar in 
D2009+.  Your code is not taking that into account.

I would suggest a slightly different approach.  Use a Char array just to 
retreive the Registry value, and then use a String for everything else.  
This should work in both D7 and D2010:

{code:delphi}
uses
  ..., SysUtils, Windows;

procedure OpenFileWithExe;
var
  hReg: HKEY;
  Ret: Longint;
  RegDataType, RegDataSize: DWORD;
  InstallPath: array [0..MAX_PATH] of Char;
  CmdLine: String;
  Len: Integer;
  SInfo: TStartupInfo;
  PInfo: TProcessInformation;
begin
  Ret := RegOpenKeyEx(HKEY_CURRENT_USER, 'SOFTWARE\leakTracker', 0, KEY_QUERY_VALUE, 
hReg);
  if Ret <> 0 then Exit;
  ZeroMemory(@InstallPath, SizeOf(InstallPath));
  RegDataType := REG_SZ;
  RegDataSize := SizeOf(InstallPath);
  Ret := RegQueryValueEx(hReg, 'Installation_path', nil, @RegDataType, @InstallPath, 
@RegDataSize);
  RegCloseKey(hReg);
  if Ret <> 0 then Exit;
  CmdLine := String(InstallPath) + ' "' + ChangeFileExt(ParamStr(0), '') 
+ '_file_leak_log.umlt"';
  ZeroMemory(@SInfo, SizeOf(SInfo));
  SInfo.cb := SizeOf(SInfo);
  ZeroMemory(@PInfo, SizeOf(PInfo));
  if CreateProcess(nil, PChar(CmdLine), nil, nil, False, NORMAL_PRIORITY_CLASS, 
nil, nil, SInfo, PInfo) then
  begin
    CloseHandle(PInfo.hThread);
    CloseHandle(PInfo.hProcess);
  end;
end;
{code}

--
Remy Lebeau (TeamB)
0
Remy
7/19/2012 5:00:55 PM
Presley wrote:

> but i get *Runtime error 203 at 004029f8* at +sExename :=ParamStr(0);+
> .  (Heap overflow error)

That line is allocating a new Delphi string on the heap.  If that line is 
failing at runtime, then this code is most likely being called in a spot 
that is not allowed to allocate any memory from the RTL at all.  That would 
explain why the original code was coded the way it was, using a single static 
array to hold everything.  If that is the case, then let's go back to the 
original code and make it work with D2010 correctly:

{code:delphi}
procedure OpenFileWithExe;
var
  hReg: HKEY;
  Ret: Longint;
  RegDataType, RegDataSize: DWORD;
  CmdLine: array [0..((MAX_PATH*2)+40)] of Char;
  Len: DWORD;
  SInfo: TStartupInfo;
  PInfo: TProcessInformation;
begin
  ZeroMemory(@CmdLine, SizeOf(CmdLine));
  Ret := RegOpenKeyEx(HKEY_CURRENT_USER, 'SOFTWARE\leakTracker', 0, KEY_QUERY_VALUE, 
hReg);
  if Ret <> 0 then Exit;
  RegDataType := REG_SZ;
  RegDataSize := MAX_PATH * SizeOf(Char);
  Ret := RegQueryValueEx(hReg, 'Installation_path', nil, @RegDataType, @CmdLine, 
@RegDataSize);
  RegCloseKey(hReg);
  if Ret <> 0 then Exit;
  lstrcat(CmdLine, ' "');
  Len := lstrlen(CmdLine);
  Inc(Len, GetModuleFileName(0, @CmdLine[Len], MAX_PATH));
  while CmdLine[Len-1] <> '.' do
    Dec(Len);
  CmdLine[Len-1] := #0;
  lstrcat(CmdLine, '_file_leak_log.umlt"');
  ZeroMemory(@SInfo, SizeOf(SInfo));
  SInfo.cb := SizeOf(SInfo);
  ZeroMemory(@PInfo, SizeOf(PInfo));
  if CreateProcess(nil, CmdLine, nil, nil, False,NORMAL_PRIORITY_CLASS, nil, 
nil, SInfo, PInfo) then
  begin
    CloseHandle(PInfo.hThread);
    CloseHandle(PInfo.hProcess);
  end;
end;
{code}

--
Remy Lebeau (TeamB)
0
Remy
7/23/2012 12:53:48 AM
> {code:delphi}
> uses
>   ..., SysUtils, Windows;
> 
> procedure OpenFileWithExe;
> var
>   hReg: HKEY;
>   Ret: Longint;
>   RegDataType, RegDataSize: DWORD;
>   InstallPath: array [0..MAX_PATH] of Char;
>   CmdLine: String;
>   Len: Integer;
>   SInfo: TStartupInfo;
>   PInfo: TProcessInformation;
> begin
>   Ret := RegOpenKeyEx(HKEY_CURRENT_USER, 'SOFTWARE\Dracker', 0, KEY_QUERY_VALUE, 
> hReg);
>   if Ret <> 0 then Exit;
>   ZeroMemory(@InstallPath, SizeOf(InstallPath));
>   RegDataType := REG_SZ;
>   RegDataSize := SizeOf(InstallPath);
>   Ret := RegQueryValueEx(hReg, 'Installation_path', nil, @RegDataType, @InstallPath, 
> @RegDataSize);
>   RegCloseKey(hReg);
>   if Ret <> 0 then Exit;
>   CmdLine := String(InstallPath) + ' "' + ChangeFileExt(ParamStr(0), '') 
> + '_file_leak_log.umlt"';
>   ZeroMemory(@SInfo, SizeOf(SInfo));
>   SInfo.cb := SizeOf(SInfo);
>   ZeroMemory(@PInfo, SizeOf(PInfo));
>   if CreateProcess(nil, PChar(CmdLine), nil, nil, False, NORMAL_PRIORITY_CLASS, 
> nil, nil, SInfo, PInfo) then
>   begin
>     CloseHandle(PInfo.hThread);
>     CloseHandle(PInfo.hProcess);
>   end;
> end;
> {code}


hello,  Thank you for the solution..but there is a little problem.See the above code is being used in FASTmm4, so i cannot use SysUtils in fastmm4. so i slighlty modified the your code as this to account for ChangeFileExt without using SysUtils  as

{code}
procedure OpenFileWithExe;
var
  hReg: HKEY;
  Ret: Longint;
  RegDataType, RegDataSize: DWORD;
  InstallPath           : array [0..MAX_PATH] of Char;
  CmdLine               : String;
  SInfo                 : TStartupInfo;
  PInfo                 : TProcessInformation;
  sExename              : string;
  sNAmeWithoutExTension : string;
begin
  sExename :=ParamStr(0);
  sNAmeWithoutExTension :=copy(sExename,0,length(sExename)-4);

  Ret := RegOpenKeyEx(HKEY_CURRENT_USER, 'SOFTWARE\Dracker', 0, KEY_QUERY_VALUE,
hReg);
  if Ret <> 0 then Exit;
  ZeroMemory(@InstallPath, SizeOf(InstallPath));
  RegDataType := REG_SZ;
  RegDataSize := SizeOf(InstallPath);
  Ret := RegQueryValueEx(hReg, 'Installation_path', nil, @RegDataType, @InstallPath,
@RegDataSize);
  RegCloseKey(hReg);
  if Ret <> 0 then Exit;
  CmdLine := String(InstallPath) + ' "' + {ChangeFileExt(ParamStr(0), '')}sNAmeWithoutExTension
+ '_f_log.t"';
  ZeroMemory(@SInfo, SizeOf(SInfo));
  SInfo.cb := SizeOf(SInfo);
  ZeroMemory(@PInfo, SizeOf(PInfo));
  if CreateProcess(nil, PChar(CmdLine), nil, nil, False, NORMAL_PRIORITY_CLASS,
nil, nil, SInfo, PInfo) then
  begin
    CloseHandle(PInfo.hThread);
    CloseHandle(PInfo.hProcess);
  end;
end;

{code}

but i get *Runtime error 203 at 004029f8* at +sExename :=ParamStr(0);+ .  (Heap overflow error)


Now to get the exe name i also tried this 

{code}
function GetModuleName: string;
var
  szFileName: array[0..MAX_PATH] of Char;
begin
  FillChar(szFileName, SizeOf(szFileName), #0);
  GetModuleFileName(hInstance, szFileName, MAX_PATH);
  Result := szFileName;
end;
{code}

and 

{code}
  procedure OpenFileWithExe;
var
  ..
  ..
begin
  sExename :=GetModuleName;
  sNAmeWithoutExTension :=copy(sExename,0,length(sExename)-4);
....
...
...
{code}

but stil the same error comes  *Runtime error 203 at 004029f8*  at *  Result := szFileName;*
any ways to solve this?

Edited by: Presley Dias on Aug 30, 2012 6:05 AM
0
Presley
8/30/2012 1:06:38 PM
In D2010 a Char is 2 bytes in size. So if RegDataSize contains the size 
of the string, it contains only half of that characters.

-- 
Uwe Raabe
Embarcadero MVP
Uwe's Blog: The Art of Delphi Programming <http://www.uweraabe.de/>
0
Uwe
8/30/2012 2:28:11 PM
Presley Dias wrote:
> hello,
> i have a procedure that open's a file by passing the file name as the parameter to the executable.
> something like this
> 
> {code}
>   C : \ P r o g r a m   F i l e s \ Da c k e r \ D r a c k e r . e x e   " G : \ D E l p h i   7 \ D e l p h i 7 A p p _ l o g . t "
> {code}
> 
> The source code is 
> 
> {code}
>      procedure OpenFileWithExe
> var
>   hReg: HKEY;
>   Ret: Longint;
>   RegDataType, RegDataSize: DWORD;
>   CmdLine: array [0..560] of Char;  
 > begin
 > ...
>   Len := windows.GetModuleFileName(0,PChar(@CmdLine[RegDataSize + 1]), 260) + RegDataSize;
> 

RegDataSize will be the amount of bytes, but you are accessing the bytes div 2th 
caracter.  Char is now unicode so in D7

CmdLine: array [0..560] of Char;

561 bytes long and the regDatasize returned in

  Ret := windows.RegQueryValueEx(hReg,'Installation_path',nil, @RegDataType, 
@CmdLine, @RegDataSize);

was a 1:1 to position of the elements in the array.  In D2010 Char is now 
Unicode so 2 bytes big so the size of the array is 1122 bytes and RegDataSize = 
twice the size of the #of characters returned.

So for

C:\Program Files\Dacker\Dracker.exe

in D7 RegDataType returned 36 and you wanted to start at element 37.  In D2010, 
since it is using the RegQueryValueExW version of the call, RegDataSize will be 
coming back 72 and your code is starting at element 73 of your array which is 
wrong.  You still want to start at element 37 of the array in the call to 
GetModuleName

   Len := Winapi.Windows.GetModuleFileName(0,PChar(@CmdLine[trunc(RegDataSize / 
sizeof(Char)) + 1]), 260) + RegDataSize;

should get it right.
-- 
Jeff Overcash (TeamB)
       (Please do not email me directly unless  asked. Thank You)
And so I patrol in the valley of the shadow of the tricolor
I must fear evil. For I am but mortal and mortals can only die.
Asking questions, pleading answers from the nameless
faceless watchers that stalk the carpeted  corridors of Whitehall.
              (Fish)
0
Jeff
8/30/2012 5:14:15 PM
Reply:

Similar Artilces:

SEPA components for Delphi with Source Code (Delphi 5
Hi all, in the european union change next year the Bankingformat to the SEPA Format. All peoples and companies must change the bankingssoftware and the costumer data form acountnummers in the new IBAN and BIC numbers. See: http://www.arma-it.de/shop/artikelueber.php?wgruppeid=211&wgruppe_offen=211 Functions: - generate SEPA XML'S - Calc IBAN - BIC Database (DE,AT and CH) Questions: vertrieb@arma-it.de PS: Bankinssoftware for Develpoers (Germany only) http://www.arma-it.de/shop/artikelueber.php?wgruppeid=212&wgruppe_offen=212 El 26/10/13 21:38, A...

dll fails when compiled with delphi 2010, but works with delphi 7
I may be doing good if someone can just point me to the right forum I have not created a dll for some time and have not written one with 2010 before. The dll I am creating will be called as a cfx function by either a ColdFusion or BlueDragon webserver. I have written cfx DLLs in the past. The function declaration is below, it is the standard declaration from ColdFusion or Bluegradon documention on creating a CFX. procedure ProcessTagRequest(Request: TCFXRequest); export; cdecl; Since this was the first time using 2010 I wrote a very basic function to build off that was not much mor...

delphi 2006 code in delphi 2010
hello, is there any option to make delphi 2006 code work in delphi 2010? something like in java IDEs where you can define the code level you like to use? the problem is, that i made a project with 2006 and sent it to my customer. they got 2010 and it compiles fine, but it just doesn't work. it deals with en-/decryption of text, we assumed, that it has something to do with ansi vs. unicode strings... but we cant find the exact position where the error occurs. i am a bit dissapointed, because everywhere i read that the new IDE will always be downwards compatible and so on.. but in ...

Migrating From Delphi 7 to Delphi 2010
We did not know which forum was the best for this question. We have been wanting to migrate from Delphi 7 to a later version for years but it appears to be a daunting task. We first looked at D2006 and that was a radical new world. We bought D2010 a couple of years ago and not done much with it because there are so many parts to our applications. We have done a few new applications in D2010 and they seem to work okay. D2010 has not been impressive, perhaps because of the strangeness compared to D7. Is is possible for us to do a phased sort of migration where we do a form at a time? ...

Using Delphi 7 and Delphi 2010
I had a project in Delphi 7. I worked on it in Delphi 2010. When I try to open the .dpr again in Delphi 7, the IDE toolbar widens across both monitors, and Delphi 7 locks up. It appears that Delphi 2010 modifies the .dpr in a way that makes Delphi 7 unable to open it again. All my forms & units appear to open fine in D7 after D2010, except for the warnings on the ExplicitHeight and ExplicitWidth properties being missing... I can easily recreate the .dpr, but is this expected behavior? Thanks. Tom Field wrote: > I had a project in Delphi 7. > > I worked o...

Why does this work fine in Delphi 2009, but not in Delphi 2010
I've been racking my head trying to figure this out and can't understand what is wrong, TFileStream.ReadComponentRes fails when I try to read a component containing a record, it works fine in Delphi 2009 and Delphi 2007, but fails with Delphi 2010 Here is the unit source and DFM *+//UnitSource+* unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TThresholdMode = (tm0,tm1,tm2,tm3,tm4,tm5); TThreshold = Record Mode:TThresholdMode; Filter,Start,Stop:Integer; end; ...

Convert Delphi 7 to Delphi 2009 [Edit]
Hi! Please, I have a code done in Delphi 7... Now I want to convert Delphi 7 to Delphi 2009 but I'm having problems when compile the code. Error message: +[DCC Fatal Error] Far.dpr(9): F2063 Could not compile used unit 'System.pas'+ Please can somebody help me? Source Download (349KB): http://rapidshare.com/files/256191328/FileManager.rar.html Mirror Source Download: http://www.megaupload.com/?d=12GYLPT0 Password: delphi Thank u so much! (sorry for my bad english, it is not my native language) Edited by: loquax loquax on Jul 15, 2009 12:24 PM Sorry, bu...

Delphi 7 to Delphi 2010
We have decided to move up some applications running under Delphi 7 to Delphi 2010. However, I was surprise to see that simply recompiling the application causes the application to be much slower than version 7. We have a lot of string transformation routines, some mathematical transformations, etc. When I mean slower, I mean up to two times slower than with Delphi 7, so it not a minor difference. (The EXE is also a lot bigger but I don't worry too much about that). Is there something I can do to obtain the same kind of speed I had in Delphi 7 but with Delphi 2010? ...

Pchar for PansiChar
hello, I use a DLL developed in D7 and not have the same sources. I will use Delphi 2010 and the functions do not work function TkmInitialize(LOGXMLDIR: PChar; TkmByExt: dWord): dWord; stdcall; external 'trackbuffer.dll'; function TkmCreateStream(FileName: PChar; Var Stream: dWord; Var Error: dWord): PChar; stdcall; external 'trackbuffer.dll'; function TkmLogEnd(Stream: dWord; MediaDuration, MediaPosition, MediaType: dWord; MediaName: PChar): dWord; stdcall; external 'trackbuffer.dll'; function TkmIsTkm(FileName: PChar): Bool; stdcall; external 'trackbuffer.dl...

Delphi 7 to Delphi XE: TBlobField to XML [Edit]
Hi, I'm migrating a Delphi7 application to Delphi XE. I'm using a TClientDataSet to communicate, by using a XML frame, with my server. In this TClientDataSet I'm using a TBlobField which is an array of 384 byte. The blobField is allocate by a code like this : {code} myStream : TStream; myStream := aClientDataSet.CreateBlobStream(myBlobField, bmwrite); vResult := myStream.Write(ArrayOf384Byte[0], length(ArrayOf384Byte)); //vResult = 384 => GooD ! (...) {code} For communicate with the server, we have to decode the Blobfield in XML before to sending it. We have...

Delphi 7.0 code convert to delphi XE ...
Hello All, I create an application using Web Server Application then CGI stand alone... In WebModule I add ModuleController component and IWPageProcedure... Below is my code in Delphi 7.0, this is how to call another units in webmodule... .... .... procedure TWebModule1.proMainGetForm(ASender: TIWPageProducer; AWebApplication: TIWApplication; var VForm: TIWPageForm); begin VForm := TfrmMain.Create(AWebApplication); end; procedure TWebModule1.proLogInGetForm(ASender: TIWPageProducer; AWebApplication: TIWApplication; var VForm: TIWPageForm); begin VForm := TfrmLogIn.Create(AWebA...

Is it worth to move my code from Delphi 2009 to Delphi 2010?
Hi guys, we are working on Delphi 2009 till this day because we do not have the time to upgrade our code to the newest version. There is always something more important (features, bugs...) and our code has 2+ million lines. I thought that instead of moving from D2009 to XE7 I could atleast move code to D2010 because it is more or less backward compatible and it shouldn't take me that much of a work. I wanted to ask you about your opinion. Is it a good version to move to? Regards. Dimitrij wrote: > I thought that instead of moving from D2009 to XE7 I could atleast > move ...

Update Delphi 2005 to Delphi 2010, which do i need? [Edit]
Hello, we have one Delphi 2005 Professional here and want to upgrade to Delphi 2010, but we are a bit confused. Our distributor in Germany, ingram-micro offers several upgrade products: UPG DELPHI 2010 PRO - NAMED USER UPG DELPHI 2010 PRO - NAMED USER ELS UPG DELPHI 2010 PRO - NAMED USER FLEX RAD STUDIO 2010 PRO - UPG UPG RAD STUDIO 2010 PRO - NAMED ELC UPG RAD STUDIO 2010 PRO - NAMED FLEX UPG DELPHI 2010 PRO - CONCURRENT ELS UPG DELPHI 2010 PRO - CONCURRENT FLEX What do they mean exactly and which one do i need? At the moment delphi is installed on two PCs and we want to use ...

Delphi 6 to Delphi 2010 character codes conversion
I an converting a unit from Delphi 6 to Delphi 2010. Everything works except for a couple of character codes, the decimal values are(224 and 227). As far as I can tell when data is loaded from the socket into a buffer, the codes are ok. When they are written to another buffer these 2 codes use the upper case version of the characters(192 and 224). I don' t see it on any other of the codes. I set the code page in the compiler options to 1252, but that did not work. Any other options I can set in Delp hi 2010 to correct this? TIA Jan B wrote: > I an converting a unit from D...

Web resources about - Code works in Delphi 7 but not in Delphi 2010 [Edit] - embarcadero.delphi.non-tech

Delphi - Wikipedia, the free encyclopedia
... an archaeological site and a modern town in Greece on the south-western spur of Mount Parnassus in the valley of Phocis . The site of Delphi ...

Delphi Automotive (@DelphiAuto) on Twitter
Log in Sign up You are on Twitter Mobile because you are using an old version of Internet Explorer. Learn more here Delphi Automotive @ DelphiAuto ...

Delphi Connect for Verizon on the App Store on iTunes
Get Delphi Connect for Verizon on the App Store. See screenshots and ratings, and read customer reviews.


Audi working with Delphi to develop autonomous car tech
Audi is developing an iPad-sized device that will pack all the necessary computing power for a self-driving car

US approves China company's acquisition of Delphi biz
The Committee on Foreign Investment in the United States has formally approved the acquisition of Delphi's global production of braking systems ...

Verizon And Delphi Officially Launch Vehicle Diagnostics Service - $250 For The Module, $5 A Month On ...
If you're a car nut, a paranoid parent, or a small business owner looking to do a little, uh, company vehicle economy analysis, Verizon's teamed ...

Watch out Google: Delphi gives Ars a ride in its self-driving car
The automotive components maker gave Ars a preview ride around the neighborhood. MOUNTAIN VIEW, CA—On Thursday morning I met with Delphi at its ...

The skinny on Delphi's autonomous road trip across the United States
Filed under: Green , Videos , Autonomous Last week, Delphi's autonomous car became the first to complete a coast-to-coast trip across the United ...

Delphi partners with WiTricity on automated wireless charging system
One could easily argue that parking between the white lines at any local hangout presents a challenge for some inexperienced drivers. So, why ...

Resources last updated: 1/15/2016 8:13:28 AM