Go Back   Winamp & Shoutcast Forums > Developer Center > NSIS Discussion

Reply
Thread Tools Search this Thread Display Modes
Old 24th June 2009, 08:20   #81
claesabrandt
Member
 
claesabrandt's Avatar
 
Join Date: Aug 2008
Location: Denmark
Posts: 54
SlyW: Sorry for the delay. I honestly don't know why .NET Framework SP1 makes things work, but your findings sound resonable.
claesabrandt is offline   Reply With Quote
Old 18th August 2009, 16:00   #82
dmccoy
Junior Member
 
Join Date: Aug 2009
Posts: 2
Dependency Assemblies

This may be old news, but I believe I have found a fix for the dependent assemblies problem using the AssemblyResolve event. I hope it will be of use to you.

My managed C++ skills are not the greatest, but please find attached my modified source file.

Thank you for creating the CLR NSIS plug in. It has proven very valuable - we use it often.

Best Regards,

David
Attached Files
File Type: txt nsis_clr_loader.txt (7.6 KB, 849 views)
dmccoy is offline   Reply With Quote
Old 19th August 2009, 06:45   #83
claesabrandt
Member
 
claesabrandt's Avatar
 
Join Date: Aug 2008
Location: Denmark
Posts: 54
Re: Dependency Assemblies

David, that looks interesting! That is really something I want to fix in the plugin. I will take a look at your code. I don't think this is old news, at least not for me, because I still had no solution to it. If I understand it right, will it then be possible to place the dependant assemblies anywhere and not necessarily in the same folder hierachy as the calling exe/dll?
claesabrandt is offline   Reply With Quote
Old 19th August 2009, 08:15   #84
kichik
M.I.A.
[NSIS Dev, Mod]
 
kichik's Avatar
 
Join Date: Oct 2001
Location: Israel
Posts: 11,343
What are the requirements for building this plug-in? Can I build it using VC6?

NSIS FAQ | NSIS Home Page | Donate $
"I hear and I forget. I see and I remember. I do and I understand." -- Confucius
kichik is offline   Reply With Quote
Old 19th August 2009, 08:53   #85
claesabrandt
Member
 
claesabrandt's Avatar
 
Join Date: Aug 2008
Location: Denmark
Posts: 54
No. It has to be at least Visual Studio 2005 as .NET 2.0 must be supported.
claesabrandt is offline   Reply With Quote
Old 19th August 2009, 09:20   #86
kichik
M.I.A.
[NSIS Dev, Mod]
 
kichik's Avatar
 
Join Date: Oct 2001
Location: Israel
Posts: 11,343
Too bad... Will just have to wait for the day I finally switch to 2008 I guess. But keep 'em coming. It's a useful plug-in.

NSIS FAQ | NSIS Home Page | Donate $
"I hear and I forget. I see and I remember. I do and I understand." -- Confucius
kichik is offline   Reply With Quote
Old 19th August 2009, 09:50   #87
claesabrandt
Member
 
claesabrandt's Avatar
 
Join Date: Aug 2008
Location: Denmark
Posts: 54
The free express editions of VS works too, and can be installed alongside with VC6. Anyway, I will most likely implement Davids modification in the CLR.dll, so the dependant assembly problem will be solved for everyone, without having to recompile the source.
claesabrandt is offline   Reply With Quote
Old 19th August 2009, 15:15   #88
dmccoy
Junior Member
 
Join Date: Aug 2009
Posts: 2
Hi Claes,

The default assembly resolution mechanism should be called first, so assemblies registered in the GAC should still work. However, if the default assembly resolution fails it will attempt to load the assembly from the directory containing the assembly that was explicitly executed using CallCLR. I suppose it could be modified without a great deal of effort to accept a Java-like class path of directories to search for dependency assemblies.

Again, thank you for creating this plug in. We used it to replace a very clunky XML-driven solution that we used to use for performing install tasks from .NET DLLs.

Best Regards,

David
dmccoy is offline   Reply With Quote
Old 17th June 2010, 07:08   #89
timc_
Junior Member
 
Join Date: Jun 2010
Posts: 1
I notice it has been quite some time since talk of changing the way dependent assemblies are located. Is this no longer likely to happen?

Also, is there any particular reason why the plugin requires the assembly being called to have a .dll extension? I tried making calls to an exe (eg. foo.exe) and received a message indicating that the file (eg. foo.exe.dll) could not be found.
timc_ is offline   Reply With Quote
Old 27th September 2010, 17:21   #90
jayfox911
Junior Member
 
Join Date: Jun 2007
Location: san diego, ca
Posts: 13
Has anyone tested with Windows 7? I am trying to recompile my NSIS installer that was built on XP but now it will not work on Windows 7.
I have .NET 2.0 SP1 framework installed and download the newest CLR.zip form
http://nsis.sourceforge.net/Call_.NE...ethods_plug-in

nsi file
PHP Code:
OutFile "setup.exe"
Section

  InitPluginsDir
  SetOutPath $PLUGINSDIR
  
  File 
"AccessClass.dll"
  
File CLR.dll
  CLR
::Call /NOUNLOAD AccessClass.dll AccessClass.Access removeData 1 "dataTable"
  
  
pop $0  
  MessageBox MB_OK 
$0
  CLR
::Destroy
  
SectionEnd 
From the MakeNSISW
PHP Code:
InitPluginsDir
SetOutPath
"$PLUGINSDIR"
File"AccessClass.dll" [compress4493/24576 bytes
File
"CLR.dll" [compress31773/95744 bytes
Invalid command
CLR::Call
Error in script 
"C:\testscript.nsi" on line 9 -- aborting creation process 
jayfox911 is offline   Reply With Quote
Old 27th September 2010, 22:03   #91
jayfox911
Junior Member
 
Join Date: Jun 2007
Location: san diego, ca
Posts: 13
Quote:
Originally Posted by rbchasetfb View Post
claesabrandt, very cool that we got through that one. Thanks for sticking with it too. As a thanks, I thought I would post some code that I use in my .NET dll that CLR.dll is calling. It allows the functions in the .NET dll to update the Details list during the install without have to wait to return to the installer and then do a DetailPrint call with some funky string work. The code is in VB.NET, but could easily be converted to C#. The error handling is a little brute force in the MakeLogEntry function, it just ignores the error and returns, potentially writing nothing to the Details list. Non-the-less, very useful I think.

VB.NET Code Required:
PHP Code:
Imports System
Imports System
.Runtime.InteropServices
Imports System
.Threading
Imports System
.IO
Imports System
.Windows.Forms

Namespace NSIS

    
Public Class TestClass

        
//LVITEM Structure Declaration.
        
<StructLayout(LayoutKind.Sequential)> _
        
Public Structure LVITEM
            
Public mask As Int32
            
Public iItem As Int32
            
Public iSubItem As Int32
            
Public state As Int32
            
Public stateMask As Int32
            
Public pszText As String
            
Public cchTextMax As Int32
            
Public iImage As Int32
            
Public lParam As IntPtr
        End Structure

        
//SendMessage API declarations.
        
Public Declare Function SendMessageLV Lib "user32" Alias _
          
"SendMessageA"(ByVal hwnd As IntPtr_
                         ByVal wMsg 
As Int32_
                         ByVal wParam 
As Integer_
                         ByRef lParam 
As LVITEM) As Integer
        
Public Declare Function SendMessage Lib "user32" Alias _
          
"SendMessageA"(ByVal hwnd As IntPtr_
                         ByVal wMsg 
As Int32_
                         ByVal wParam 
As Integer_
                         ByRef lParam 
As Integer) As Integer                

        
//Constants used by LVITEM and SendMessage
        
Public Const LVM_FIRST as Integer = &H1000 
        
Public Const LVM_GETITEMCOUNT as Integer LVM_FIRST 4
        
Public Const LVM_GETITEM as Integer LVM_FIRST 5
        
Public Const LVM_INSERTITEM as Integer LVM_FIRST 7
        
Public Const LVM_SCROLL as Integer LVM_FIRST 20
        
Public Const LVIF_TEXT as Integer = &H0001
        
Public Const LVIS_FOCUSED as Integer = &H0001

        
//Test function for calling from an NSIS installer using CLR.dll
        
Public Function ChopString_
                ByVal hwnd 
as IntPtr_
                ByVal stringToChop 
as String_
                ByVal chopToLength 
as Integer) As String
            Dim ret 
as String ""
            
If stringToChop.Length chopToLength Then
                MakeLogEntry
(hwnd"Chopping String '" stringToChop "'.")
                
ret stringToChop.SubString(0,chopToLength)
                
MakeLogEntry(hwnd"String chopped to '" ret "'.")
            Else
                
MakeLogEntry(hwnd"String '" _
                    stringToChop 
_
                    
"' to short to chop to length '" _
                    chopToLength 
"'.")
            
End If
            Return 
ret
        End 
Function

        
//Here's the key function that writes to the Details list.
        
Public Sub MakeLogEntry(ByVal hwnd As IntPtrentry as String)
            Try
                
//Get current list count
                
Dim c as Integer SendMessage(hwnd,LVM_GETITEMCOUNT,0,0)+1
                
//Setup a LVITEM structure for the Insert message
                
Dim lv As New LVITEM
                lv
.iItem c
                lv
.pszText entry
                lv
.mask LVIF_TEXT
                lv
.stateMask LVIS_FOCUSED
                lv
.state LVIS_FOCUSED
                
//Insert the LVITEM into the list
                
SendMessageLV(hwndLVM_INSERTITEM0lv)
                
//Scroll the list so the item is visible
                
SendMessage(hwnd,LVM_SCROLL,0,12)
            Catch 
ex As Exception
                
'Do Nothing, just return
            End Try
        End Sub

    End Class

End NameSpace 
NSIS Code with CLR.dll call to test with:
PHP Code:
Name "Test CLRDLL MakeLogEntry"
OutFile "TestCLRDLL.exe"
ShowInstDetails show
Var DetailsHWND
Page instfiles

Section
    DetailPrint 
"Starting Test"
    
InitPluginsDir
    SetOutPath $PLUGINSDIR
    File 
"TestCLRDLL.dll"
    
FindWindow $"#32770" "" $HWNDPARENT
    GetDlgItem $DetailsHWND 
$0 1016
    CLR
::Call "TestCLRDLL.dll" \
        
"NSIS.TestClass" \
        
"ChopString" \
        
\
        
$DetailsHWND "Testing Make Log Entry" 9
    Pop 
$0
    DetailPrint 
"ChopString Result = $0"
    
DetailPrint "Test Complete"
SectionEnd 
Lastly, I've attached a zip file of the TestCLRDLL.dll project for VS2005 and included the TESTCLRDLL.nsi as will. Enjoy. I hope it's as useful for use as it is for me.
This example will not work for me also. Any ideas?
jayfox911 is offline   Reply With Quote
Old 28th September 2010, 19:41   #92
Afrow UK
Moderator
 
Afrow UK's Avatar
 
Join Date: Nov 2002
Location: Surrey, England
Posts: 8,434
Firstly you don't need to extract plug-in DLL's to use them. NSIS handles that itself. Also, if NSIS says a plug-in call is an invalid command then that means your plug-in DLL isn't in the NSIS Plugins folder.

Stu
Afrow UK is offline   Reply With Quote
Old 28th September 2010, 20:42   #93
jayfox911
Junior Member
 
Join Date: Jun 2007
Location: san diego, ca
Posts: 13
Quote:
Originally Posted by Afrow UK View Post
Firstly you don't need to extract plug-in DLL's to use them. NSIS handles that itself. Also, if NSIS says a plug-in call is an invalid command then that means your plug-in DLL isn't in the NSIS Plugins folder.

Stu
Thank you that worked.
I put the CLR.dll in the \Program Files\NSIS\Plugins\ folder. Just like the second sentence of the CLR wiki says to do. Next time I will RTFM
jayfox911 is offline   Reply With Quote
Old 10th November 2010, 19:31   #94
taralex
Junior Member
 
Join Date: Nov 2010
Posts: 7
Unicode support

I got stuck for a couple of days when trying to move my installation to a Unicode-based NSIS. All my calls just stopped working. After a vain search for a similar dll, but supporting unicode, I downloaded the original source and upgraded it.
Now this was my first ever experience with c++, so I'm really not sure if I just didn't screw something up, but it worked in a couple of tests I did. I posted the link to the updated code on the Viki page.

I moved all the more or less complex functionality to a .net dll now, because all other means of calling dlls (like System::Call) stopped working in the Unicode release of NSIS.
taralex is offline   Reply With Quote
Old 19th September 2011, 17:22   #95
langdon
Junior Member
 
Join Date: May 2006
Posts: 17
Is anyone capable of recompiling this to add 4.0 support? It'll execute 4.0 assemblies, but will fail if you use any 3.5+ features (like simple Linq statements).
langdon is offline   Reply With Quote
Old 17th August 2012, 11:24   #96
mfiedlerwd
Junior Member
 
Join Date: Aug 2012
Posts: 2
Hi Claes,

I have already problems on setting/getting Properties.

Quote:
namespace test
{
public class test
{

// Properties
private string _Name = "";

public string Name
{
get { return _Name; }
set { _Name = value; }
}


public string helloworld()
{
return "Hello " + Name;
}
}
}
I first call the set_name Property, then the helloworld method. But allways the Propety is empty on the second call.

It seems that on every call will generated a new object instance of the dll.

Did you already hav fixed this problem? Or have a solution?

Best Regards,
Michael
mfiedlerwd is offline   Reply With Quote
Old 17th August 2012, 17:23   #97
Afrow UK
Moderator
 
Afrow UK's Avatar
 
Join Date: Nov 2002
Location: Surrey, England
Posts: 8,434
To avoid incompatibility issues which can occur with different .NET versions I would put your .NET code into a command-line executable and run it using ExecDos.

Stu
Afrow UK is offline   Reply With Quote
Old 20th August 2012, 07:30   #98
mfiedlerwd
Junior Member
 
Join Date: Aug 2012
Posts: 2
Hi Stu, thanks for the suggestion.

Well, when i do a simple call it works fine with an exe or the dll as well.

But when i need to do multiple calls, i think i will have a problem with an exe. (ex. i have to do some database related work and in OLEDB-PLUGIN script files are limited to 60k, so i wrote a .net dll )

Best regards

Michael

Last edited by mfiedlerwd; 20th August 2012 at 09:36.
mfiedlerwd is offline   Reply With Quote
Old 27th April 2014, 22:52   #99
ghers
Junior Member
 
Join Date: Apr 2014
Posts: 1
Plug in doesn't work for me

Hi Claes,

I'm new to NSIS and I'm probably making a lot of beginner's errors...

I tried your plug in and it seems to ignore the /NOUNLOAD setting. When I call my DLL the first time it works, but any time after that I get "object reference not set to an instance of an object" exception. When I try the same DLL with a C# test program it behaves as expected.

Attached is a screenshot of what's happening. I've commented out additional tests as it already fails on the 2nd call. I'll be happy to send you the source code of my DLL.

This DLL is really just a work-around. What I really need is a page like the install log page which shows DetailPrint messages and a progress bar. But I need this page to report findings and progress while I'm scanning the system for installed programs, before the user gets a chance to decide what will be installed and what not. The installer has to handle quite a lot, including external installers for Adobe, Java, Apache, MySQL, some SQL scripts, etc.. So this requires quite a bit of preparation to assess what needs to be installed for a fresh install or for an upgrade of an existing system. Since I can't figure out how to use this page for my purposes I thought that the easiest way would be to create my own in c#. After all it's just a text box and a progress bar.

I would appreciate any advice you can give.
Kind regards, Gilbert
Attached Thumbnails
Click image for larger version

Name:	NSIS_CLR.png
Views:	349
Size:	74.3 KB
ID:	51132  
ghers is offline   Reply With Quote
Old 28th April 2014, 02:28   #100
Afrow UK
Moderator
 
Afrow UK's Avatar
 
Join Date: Nov 2002
Location: Surrey, England
Posts: 8,434
You can have more than one InstFiles page. All Sections will be ran for both pages though which means you need to dynamically select/unselect the Sections you want to run before showing the page (i.e. otherwise if you have two InstFiles pages, your Sections will be executed twice). You can use the SelectSection/UnselectSection macros in Sections.nsh for that.

Stu
Afrow UK is offline   Reply With Quote
Old 23rd October 2015, 08:43   #101
Jamesn_xD
Junior Member
 
Join Date: Oct 2015
Posts: 2
Question

Hi all,

I have a little Problem with this issue.

Quote:
Another issue is that if want to call a .NET dll from your .NET dll, you will find that the installer cannot find the second .NET dll. For the moment the remedy is to wrap your installer in another installer. This other installer should place the .NET dlls in the same directory as the installer will run from. When the installer runs, the .NET dlls can now be found. There will only be distributed one setup file.
I have written a dll in C#, which makes changes on a .config file. In my dll, i use System.xml.dll.

If i have understood the solution correctly, the system.xml.dll must be in the same directory which the Installer.exe. But this isn't working by me.

This is my own dll: (for testing i have only one line)

code:
public void WriteConfigFile(string path, string datasource, string dbName, string user, string pw)
{
XmlDocument doc = new XmlDocument(); //needs System.xml.dll
}



And here is my call in the NSIS script:
code:
Section "Test Write" SEC01
SetOutPath $INSTDIR
File "Test Data\InvoiceConfigurator.exe.config"
InitPluginsDir
SetOutPath $PLUGINSDIR
File "WriteConfigFile.dll"
File "system.xml.dll"
CLR::Call /NOUNLOAD "WriteConfigFile.dll" "WriteConfigFile.WriteClass" "WriteConfigFile" 5\
"$INSTDIR\InvoiceConfigurator.exe.config" "test" "test" "testuser" "testpw"
pop $0
MessageBox MB_OK $0
SectionEnd



The NSIS scipt, Installer, WriteConfigFile.dll and System.xml.dll are in the same folder.

Here is a Screenshot of the Error MessageBox:
https://www.dropbox.com/s/o0lvmvtezp...issue.PNG?dl=0
Message in english means: "Exception has been thrown by the target of an invocation."

I hope anybody can help me!

Thanks in advance
Jamesn_xD is offline   Reply With Quote
Old 23rd October 2015, 13:15   #102
Anders
Moderator
 
Anders's Avatar
 
Join Date: Jun 2002
Location: ${NSISDIR}
Posts: 5,150
I don't claim to know anything about how .NET libraries are loaded but perhaps the CLR plugin should have a CLR::PreloadLib function that allows you to build a list of libraries that have to be LoadLibrary'd before it makes the actual call inside CLR::Call...

IntOp $PostCount $PostCount + 1
Anders is offline   Reply With Quote
Old 26th October 2015, 07:18   #103
Jamesn_xD
Junior Member
 
Join Date: Oct 2015
Posts: 2
Thank you Anders, unfortunatelly i haven't found anything like that on my Search :/
Jamesn_xD is offline   Reply With Quote
Old 16th January 2017, 08:12   #104
ashwineec
Junior Member
 
Join Date: Jan 2017
Posts: 1
Question CLR.DLL compatibility with Windows 2012

Hello,

We have created a installer using NSIS, but on Windows 2012 if we have a feature .net Framwork 3.5 as disabled then installation fails and gives error in temp file "Unable to Load CLR.DLL in installation log file."

is there any dependency for .net framework 3.5, if no please help us to fix this.
ashwineec is offline   Reply With Quote
Old 16th January 2017, 09:49   #105
JasonFriday13
Major Dude
 
JasonFriday13's Avatar
 
Join Date: May 2005
Location: New Zealand
Posts: 878
If 2.0 is included within 3.5, that would make sense that the plugin fails if .net is disabled since the plugin relies on 2.0.

"Only a MouseHelmet will save you from a MouseTrap" -Jason Ross (Me)
NSIS 3 POSIX Ninja
Wiki Profile
JasonFriday13 is offline   Reply With Quote
Old 10th March 2019, 17:57   #106
r2du-soft
Senior Member
 
r2du-soft's Avatar
 
Join Date: Nov 2013
Location: Iran
Posts: 334
how can return methods with ref parameter in CLR Plugin?

HTML Code:
        private void button1_Click(object sender, EventArgs e)
        {
            int gg = 65;
            string aa = Two_String_Returner(45, ref gg);
            MessageBox.Show(aa);
            MessageBox.Show(gg.ToString());
        }

        public string Two_String_Returner(int a, ref int b)
        {
            b = a + b;
            string Word = "Hello";
            return Word;
        }

i use from ref int in method but i cant read return value in NSIS



when i create dll and use the use from this code:

HTML Code:
CLR::Call "ClassLibrary13.dll" "ClassLibrary13.Class1" "Two_String_Returner" 2 "55" "$2"
Pop $0 # return value = exit code
CLR::Destroy
when i pop , get hello in $0
but i cannot return ref int b = "110"
r2du-soft is offline   Reply With Quote
Old 2nd April 2019, 19:03   #107
r2du-soft
Senior Member
 
r2du-soft's Avatar
 
Join Date: Nov 2013
Location: Iran
Posts: 334
I have a problem With The CLR Plugin
i need to call mydll to many times

HTML Code:
Var CNTR

Section

STR:

IntOp $CNTR $CNTR + 1

CLR::Call /NOUNLOAD "FTPCityToolkit.dll" "FTPCityToolkit.FTPCityToolkitClass" "FTPMakeDir" 4 "$FTP_Root_Address" "MainFolder/Folder$CNTR" "$FTP_Root_UserName" "$FTP_Root_PassWord"
Pop $0 # return value = exit code

Goto STR

SectionEnd

this Code Create a Folder in Ftp with name MainFolder and inside of that Create Folders Folder1, Folder2 ....
After every run of the loop My application Occupies much more space in memory
also if i use from CLR:estroy before Goto STR , application Hangs.
i how can many times use the CLR plugin without Hangs?
r2du-soft is offline   Reply With Quote
Old 10th April 2019, 13:59   #108
r2du-soft
Senior Member
 
r2du-soft's Avatar
 
Join Date: Nov 2013
Location: Iran
Posts: 334
CLR Plug-in News

New version of CLR Plug-in released

What's new in version 1.0
  • Fix bug memory overflow
  • If you need to call CLR::Call more than once now this is possible (without hang)
  • Removed CLR:estroy
Attached Files
File Type: zip CLR 1.0.zip (55.5 KB, 67 views)
r2du-soft is offline   Reply With Quote
Old 13th April 2019, 16:26   #109
r2du-soft
Senior Member
 
r2du-soft's Avatar
 
Join Date: Nov 2013
Location: Iran
Posts: 334
CLR Plug-in News

New version of CLR Plug-in released

What's new in version 1.1
  • Build with Visual Studio 2005 SP1 Professional On Windows 7 SP1 x86
  • Solve a problem that does not work on some windows (Change compile settings and use from lower .net framework (net 2.0))
Attached Files
File Type: zip CLR 1.1.zip (70.0 KB, 66 views)
r2du-soft is offline   Reply With Quote
Old 18th June 2019, 18:46   #110
tbnorris
Junior Member
 
Join Date: Jun 2019
Posts: 3
Quote:
Originally Posted by r2du-soft View Post
CLR Plug-in News

New version of CLR Plug-in released

What's new in version 1.1
  • Build with Visual Studio 2005 SP1 Professional On Windows 7 SP1 x86
  • Solve a problem that does not work on some windows (Change compile settings and use from lower .net framework (net 2.0))
I know this post is quite old, but does this plug-in have an active developer? I have made changes to the plugin for our own usage, and wanted to send those commits back upstream for others. Basically, is there a git repository, or something similar. that would take a code commit?
tbnorris is offline   Reply With Quote
Old 18th June 2019, 18:50   #111
tbnorris
Junior Member
 
Join Date: Jun 2019
Posts: 3
I did find this git repo ( https://github.com/ARLM-Keller/nsis-clr ), but it is for the 0.5 version that is on the wiki page still, and this one seems to be much more refined and because the version number is at 1.1, I am assuming that since this one is higher, it is the one that should be continued.
tbnorris is offline   Reply With Quote
Old 10th July 2019, 16:44   #112
tbnorris
Junior Member
 
Join Date: Jun 2019
Posts: 3
I noticed what I think was r2du-soft's fork of the CLR 0.5 release
So, I forked, and then did two things:
1. Updated my fork to CLR 1.1
1.1. Dropped r2du-soft's CLR 1.1 zip onto my fork
1.2. Created a pull request for r2du-soft to get his code into his fork
2. Did my needed changes
2.1. Moved to Visual Studio 2019
2.2. Moved to .NET 4.x, because .NET 4.0 released with XP SP3 which is now unsupported by Microsoft, so an assumption of 4.x should be safe now.
2.3. Added a reference to "System.Web.Services" so that assemblies that have "Service Reference" objects can load, I have a .NET 4.7.2 DLL with this situation.

My fork lives here: https://github.com/tbnorris/nsis-clr
tbnorris is offline   Reply With Quote
Reply
Go Back   Winamp & Shoutcast Forums > Developer Center > NSIS Discussion

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump