|
That depends on what you mean by "initialize a DLL"??
Dave Kreskowiak
Microsoft MVP
Visual Developer - Visual Basic 2006, 2007
|
|
|
|
|
Sorry, I should have said that better. What I mean is, is there a way to run some method within the dll immediately after the dll is loaded into memory?
Apparently it's not OK to start a bonfire of Microsoft products in the aisles of CompUSA even though the Linuxrulz web site says so
|
|
|
|
|
How are you loading the dll? Are you using Reflection(Late binding) or creating a reference (early binding). If you are late binding use a default constructor otherwise with early bound objects put your method call in any of the constructors which are important.
Personally I like to use an interface with the desired method and call the method when I use reflection to late bind. I am not sure if this is what you are looking for but I hope it helps.
|
|
|
|
|
Thanks, I figured that is what I would have to do, I was just wondering if there was some built in event or something along those lines that would be fired when a dll was loaded into memory...My error handling class needs to initialize as soon as it is loaded into memory, but I dont think that is really going to be possible so what I did was to seperate it into its own dll, make it completely shared, build a sub Main for the startup project of my application, and initialize it there...then all of the other dll's in my project include a reference to the dll and it catches exceptions from them as well...here is a copy of my class if you are interested...It's basicly just an exception logger:
'NOTE: If running on a development machine, this will not work properly unless HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\DbgJITDebugLaunchSetting is set to 1
Imports System.Windows.Forms
Imports System.Data.SqlClient
Imports ZipsCommon
Public Class ErrorHandler
#Region " Variables "
Private Shared mHasBeenInited As Boolean = False
#End Region
#Region " Constructor Lockout "
Private Sub New()
End Sub
#End Region
#Region " Event Handler "
Private Shared Sub ThreadHandler(ByVal sender As Object, ByVal e As System.Threading.ThreadExceptionEventArgs)
LogException(e.Exception, True)
End Sub
Private Shared Sub UnhandledHandler(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)
LogException(e.ExceptionObject, True)
End Sub
#End Region
#Region " Subs "
Public Shared Sub Init()
If mHasBeenInited Then Exit Sub
AddHandler Application.ThreadException, AddressOf ThreadHandler
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledHandler
mHasBeenInited = True
End Sub
Public Shared Sub LogException(ByVal ex As Exception)
LogException(ex, False)
End Sub
Private Shared Sub LogException(ByVal ex As Exception, ByVal wasUnhandled As Boolean)
Try
'NOTE: To avoid circular dependencys, all errors will be loged to the database at->SetupInfo.DBConnStr
Dim cmd As SqlCommand = New SqlCommand("NewError", New SqlConnection(SetupInfo.DBConnStr))
With cmd
.CommandType = CommandType.StoredProcedure
.Parameters.AddWithValue("@StoreID", SetupInfo.StoreID)
.Parameters.AddWithValue("@ExMsg", ex.Message)
.Parameters.AddWithValue("@StckTrc", ex.StackTrace)
.Parameters.AddWithValue("@WasUnhandled", wasUnhandled)
.Connection.Open()
.ExecuteNonQuery()
.Connection.Close()
.Connection.Dispose()
.Dispose()
End With
Catch ex2 As Exception
End Try
End Sub
Public Shared Sub Dispose()
If Not mHasBeenInited Then Exit Sub
RemoveHandler Application.ThreadException, AddressOf ThreadHandler
RemoveHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledHandler
mHasBeenInited = False
End Sub
#End Region
End Class
Apparently it's not OK to start a bonfire of Microsoft products in the aisles of CompUSA even though the Linuxrulz web site says so
|
|
|
|
|
Nevermind guys, I found the answer I needed here:
Clickety[^]
I wrote a class that should handle unhanded exceptions, but it is not working...below is the code. It is in a dll that I import into my project. I think the issue could be that the error handler is in the dll and not something In my current application, so maybe it is a thread issue? If you have any suggestions or if you know what the problem is, please let me know. Thanks.
Imports System.Windows.Forms
Imports System.Data.SqlClient
Imports ZipsCommon
Public Class ErrorHandler
#Region " Variables "
Private Shared mHasBeenInited As Boolean = False
#End Region
#Region " Constructor Lockout "
Private Sub New()
End Sub
#End Region
#Region " Event Handler "
Private Shared Sub TheHandler(ByVal sender As Object, ByVal e As System.Threading.ThreadExceptionEventArgs)
LogException(e.Exception, True)
End Sub
#End Region
#Region " Subs "
Public Shared Sub Init()
If mHasBeenInited Then Exit Sub
AddHandler Application.ThreadException, AddressOf TheHandler
mHasBeenInited = True
End Sub
Public Shared Sub LogException(ByVal ex As Exception)
If Not mHasBeenInited Then Init()
LogException(ex, False)
End Sub
Private Shared Sub LogException(ByVal ex As Exception, ByVal wasUnhandled As Boolean)
Try
If Not mHasBeenInited Then Init()
'NOTE: To avoid circular dependencys, all errors will be loged to the database at ->SetupInfo.DBConnStr
Dim cmd As SqlCommand = New SqlCommand("NewError", New SqlConnection(SetupInfo.DBConnStr))
With cmd
.CommandType = CommandType.StoredProcedure
.Parameters.AddWithValue("@StoreID", SetupInfo.StoreID)
.Parameters.AddWithValue("@ExMsg", ex.Message)
.Parameters.AddWithValue("@StckTrc", ex.StackTrace)
.Parameters.AddWithValue("@WasUnhandled", wasUnhandled)
.Connection.Open()
.ExecuteNonQuery()
.Connection.Close()
.Connection.Dispose()
.Dispose()
End With
Catch ex2 As Exception
End Try
End Sub
Public Shared Sub Dispose()
If Not mHasBeenInited Then Exit Sub
RemoveHandler Application.ThreadException, AddressOf TheHandler
mHasBeenInited = False
End Sub
#End Region
End Class
-- modified at 18:58 Thursday 19th April, 2007
Apparently it's not OK to start a bonfire of Microsoft products in the aisles of CompUSA even though the Linuxrulz web site says so
|
|
|
|
|
I am building a windows app to that will keep track of customers, quotes, orders and so forth using VB in visual studio 2005.
I have a master-detail form that contains a Quoteheader and Quoteline datagridview that where the users can add products, price, number and so forth.
I have also created another form (product search) that enables users to easily filter and search for products to pick the product(s) they want to add to the quote using a checkbox that I added to each row in the grid. (The data for this datagridview is pulled from a seperate dataset based on a view that contains, among other things, the info I need to transfer to the quoteline datagridview).
Specifically I want to insert a new row in the Quoteline datagridview on the Quoteform where I automatically add the following field values (articleID, price per unit and costprice) from the product search datagridview to their respective column cells on the quoteline datagridview. It should insert a new row in the qoteline datagridview for each product that is selected using the checkbox on the product search form.
I would like some help and advice on how to best code this operation.
|
|
|
|
|
I'm assuming that your datagridview controls are datatable driven. If so, you can create a default view from the product search table while setting a rowfilter on the check box column. Then set the datasource table of the quoteline datagridview equal to this default view.
|
|
|
|
|
I'm not sure, but I don't think what u are suggesting is quite what i am looking for.
what i am looking for is the vb.net syntax for how to do something like this:
dim aricleid as integer
dim productname as string
dim productprice as string
select
articleid,
productname,
productprice
from productsearchform.datagridview
where checkboxcolumn.checked=true
insert into quoteline.datagridview
articleidcolumn,
productnamecolumn,
productpricecolumn
with values (get the declared values from above code)
articleid,
productname,
productprice
continue to next row until all rows on the on the productsearch datagrid that have been checked have been inserted as new rows in the quoteline datagridview.
Is there a good way to do this?
|
|
|
|
|
Assume for example,
productsearchform.datagridview.datasource = datatableproductsearchform
quoteline.datagridview.datasource = datatablequoteline
Try this approach:
datatableproductsearchform.defaultview.rowfilter = "checkboxcolumn = true"
datatablequoteline = datatableproductsearchform.defaultview.totable
Or this approach:
Add this code to productsearchform.datagridview selectedindexchanged event
if productsearchform.SelectedRow.Cells.Item(0).Text = true
dim datarownew as datarow
datarownew = datatablequoteline.newrow
'use the following code to populate the fields, one per field in datatablequoteline
datarownew.item("[field name]") = productsearchform.SelectedRow.Cells.Item(1).Text
datatablequoteline.rows.add(datatownew)
end if
|
|
|
|
|
Hi Dptalt,
The last approach seems to be what I have been looking for. I'll give it a shot later today. Appreciate your help.
best regards,
Hans
|
|
|
|
|
My form has a TabControl with 4 tabs. The user fills out information on each tab. When the user tries to change to a different tab I validate the information on that tab first. The validating code is in the TabControl.Leave event. If the information the user enters is not valid I have a messagebox popup that says the information needs to be corrected. If this occurs it still goes to the new tab the user clicked on. How can I code it so that it stays on the current tab until the information is valid? Can I cancel the event so that it does not go to the new tab?
|
|
|
|
|
In this event put your msgbox and validation routine call
Private Sub TabControl1_Selecting(ByVal sender As Object, ByVal e As System.Windows.Forms.TabControlCancelEventArgs) Handles TabControl1.Selecting
'validate
'msgbox
e.Cancel = True '<- ignores tab change event
End Sub
|
|
|
|
|
HI,
I need to get the Serial number of an Xp Machine and if possible the Hard Disc Details... I tried using query to Win32_PhysicalMedia, but not able to get details about the SerialNumber and Hard Disc details..
can anyone help me in this....
Code which i tried:
Dim strSN As String = String.Empty
Dim strQuery As String = "SELECT * FROM Win32_PhysicalMedia "
Dim query As ManagementObjectSearcher = New ManagementObjectSearcher(strQuery)
Dim queryCollection As ManagementObjectCollection = query.Get()
Dim mo As ManagementObject
For Each mo In queryCollection
If mo("SerialNumber") = Nothing Then
strSN = "None"
Else
strSN = mo("SerialNumber").ToString()
Exit For
End If
Next
Regards,
Anas
|
|
|
|
|
You've missed an important detail. You need to specify a scope, or which WMI namespace you want to search and which machine to search. In the example below, that period in the scope string specifies the local machine:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' Important!! MUST use \root\cimv2 here! \root\default does NOT work!
Dim scope As New ManagementScope("\\.\root\cimv2")
' Clear out the ListView we're using to show the drives and serial numbers.
ListView1.Items.Clear()
Dim query As New ObjectQuery("SELECT * FROM Win32_PhysicalMedia")
Dim searcher As New ManagementObjectSearcher(scope, query)
Dim objectCollection As ManagementObjectCollection = searcher.Get()
For Each obj As ManagementObject In objectCollection
' The ListView is assumed to have two columns setup to old these.
Dim newItem As New ListViewItem(New String() {CStr(obj("Tag")), CStr(obj("SerialNumber")).Trim})
ListView1.Items.Add(newItem)
Next
' It's very important to dispose these objects when your done with them! If
' you don't, you'll end up with a handle leak and eventually crash the system.
objectCollection.Dispose()
searcher.Dispose()
End Sub
Now, like I said before, not every device fills in the information you want. In one of my test systems, only 2 out of 6 hard drives returned serial numbers, and one of those needed to be Trim 'd to remove some leading spaces.
Dave Kreskowiak
Microsoft MVP
Visual Developer - Visual Basic 2006, 2007
|
|
|
|
|
Do we need to change the scope from machine to machine?
When i tried your code am getting Error Msg as "Object reference not set to an instance of an object."
|
|
|
|
|
Thoombath wrote: Do we need to change the scope from machine to machine?
Yes. If you want to connect to a different machine you have to change the \\.\root\cimv2 to \\machineName\root\cimv2 .
Thoombath wrote: When i tried your code am getting Error Msg as "Object reference not set to an instance of an object."
It would help to know on which line this is occuring.
Dave Kreskowiak
Microsoft MVP
Visual Developer - Visual Basic 2006, 2007
|
|
|
|
|
I changed to my Computer Name still that Error is coming.
Its occuring on :
Dim newItem As New ListViewItem(New String() {CStr(obj("Tag")), CStr(obj("SerialNumber")).Trim})
|
|
|
|
|
Then no SerialNumber object was returned, or that object isn't in the collection. Calling Trim on it fails because you can't do this:
Nothing.Trim
Wrap that line and the next one in a Try/Catch block to ignore any errors:
For Each obj As ManagementObject In objectCollection
' The ListView is assumed to have two columns setup to old these.
Try
Dim newItem As New ListViewItem(New String() {CStr(obj("Tag")), CStr(obj("SerialNumber")).Trim})
ListView1.Items.Add(newItem)
Catch
' Warning! This will ignore ANY AND ALL ERRORS with the above two lines of code!
' In a production environment, this is usually NOT a good idea!
End Try
Next
Dave Kreskowiak
Microsoft MVP
Visual Developer - Visual Basic 2006, 2007
|
|
|
|
|
Now the Error is gone. But nothing is populated on the List View.
This might be coz of my hard drives. Is this requires Administrative login or role to function this Method?
Thanks
|
|
|
|
|
The code has to have FullTrust in order to run. That means, by default, it needs to be run from the local workstation, or if querying other machines, needs to have admin rights to the target workstation.
Dave Kreskowiak
Microsoft MVP
Visual Developer - Visual Basic 2006, 2007
|
|
|
|
|
I am trying this in an Windows Based Application and am quering to the local machine. Am a user under a Domine. Will this be the reason for not getting the answer?
|
|
|
|
|
So long as that account has admin rights to the machine, it should work. The other possibility is that the data isn't being created by any providers installed on the machine. People keep asking "How do I get the serial number of my motherboard using WMI??". Well, if the manufacturer of the motherboard doesn't provide a WMI provider, you can't. On top of that, there's nothing that says the manufacturer, even though they are providing a WMI Provider, has to fill in these kinds of details.
Like I said in my previous post, I ran the code on one of my test machines (with 6 hard drives in it) and only 2 returned serial numbers!
Dave Kreskowiak
Microsoft MVP
Visual Developer - Visual Basic 2006, 2007
|
|
|
|
|
Anyways thanks Dave.
I will try it with other systems and see how it goes.
Regards,
Anas TM
|
|
|
|
|
I am looking for retrieving the Serial Number and Hard Disc detail of an Windows Xp Machine using Vb.Net. I found some code using query to Win32_PhysicalMedia, but its not working properly. Can any one help me in this...
Regards
Anas
|
|
|
|
|
Let's see the code you're using. WMI is about the only method you've got to get this information. But, there's nothing that says the hardware or the provider for it has to fill in all the details of what you're looking for, like the serial number.
Dave Kreskowiak
Microsoft MVP
Visual Developer - Visual Basic 2006, 2007
|
|
|
|