|
The primitive types after the String, and MarshalAs, are known types with fixed sizes and are automatically Marshaled as the proper types. Typically, the only thing you have to watch out for is the structure member packing, which by default is on 8-byte boundries. Sometimes you'll com acrossed a structure where you have to specify a smaller pack size, typically 4.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
mivey4 wrote:
As for the missing attribute, what would that be and where is it documented? Microsoft isn't making it obvious.
Your actually just scratching the surface of a very BIG topic, call Interop. The documentation starts here[^] with Interoperating with Managed Code. It assumes you already know how the functions your calling work and what their requirements are, like for WaveOutGetDevCaps.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
mivey4, try this:
Imports System.Runtime.InteropServices
Public Class Form1
Inherits System.Windows.Forms.Form
#Region " Windows Form Designer generated code removed here"
Public Const MAXPNAMELEN = 32
<structlayout(layoutkind.sequential, charset:="CharSet.Auto)"> _
Structure WAVEOUTCAPS
Public wMid As Short
Public wPid As Short
Public vDriverVersion As Integer
<marshalas(unmanagedtype.byvaltstr, sizeconst:="MAXPNAMELEN)"> _
Public szPname As String
Public dwFormats As Integer
Public wChannel As Short
Public wReserved1 As Short
Public dwSupport As Integer
End Structure
Declare Auto Function waveOutGetDevCaps Lib "winmm.dll" _
(ByVal uDeviceID As Integer, _
ByRef lpCaps As WAVEOUTCAPS, _
ByVal uSize As Integer) As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim caps As New WAVEOUTCAPS
Dim dev, hWaveOut, hwnd As Integer
Dim buffer As String = (MAXPNAMELEN)
dev = waveOutGetDevCaps(0, caps, Len(caps))
TextBox1.Text = "Device = " & caps.szPname
TextBox2.Text = "Driver Version = " & caps.vDriverVersion
TextBox3.Text = "Channel = " & caps.wChannel
End Sub
End Class
|
|
|
|
|
sorry, CP messed up the struct:
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
Structure WAVEOUTCAPS
Public wMid As Short
Public wPid As Short
Public vDriverVersion As Integer
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MAXPNAMELEN)> _
Public szPname As String
Public dwFormats As Integer
Public wChannel As Short
Public wReserved1 As Short
Public dwSupport As Integer
End Structure
|
|
|
|
|
Okay! That nipped the problem in the bud.
Now for enlightenment for the initial issue. The additional lines of code that obviously made all the difference between success and failure were:
a. Imports System.Runtime.InteropServices
b. StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)
c. MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MAXPNAMELEN)
Why must these additional parameters be set in order for the API function to properly work but there isn't any direct or immediately obvious documentation for it? I have used other API structures and passed them receiving the expected results without addition of these parameters. Are there any resources available for VB.NET programmers that provide a good sound source of information for implementing API calls?
My apologies for the oversight of an additional member of the WAVEOUTCAPS structure that was mentioned earlier to me.
----> Public wReserved1 As Short
I use an API Generator utility to generate the Declarations and constants and apparently this additional member wasn't added until after the release of the utility. But I do realize the importance of providing the API calls with everything they expect or there will be problems.
Thanks
"For God so loved the world...." John 3:16
I only have one boss, J.C.
|
|
|
|
|
Here is is a reference:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcn7/html/vaconStructuresAndClasses.asp
|
|
|
|
|
And Here:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemRuntimeInteropServicesStructLayoutAttributeClassTopic.asp
|
|
|
|
|
Last one:
I like MSDN but it is hard to get around until you get used to it.
Microsoft Win32 to Microsoft .NET Framework API Map
Microsoft .NET Framework and Microsoft Visual Studio User Education Teams
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/win32map.asp
I hope all this help's but I gotta go back to work.
|
|
|
|
|
Thanks Anonymous,
All the references will most definitely be invaluable bookmarks that will more carefully review. I appreciate all the help and thanks for taking time to provide the assistance.
"For God so loved the world...." John 3:16
I only have one boss, J.C.
|
|
|
|
|
Hello all,
First post here and I'll start by saying that, while I've done a few basic VB projects, I am very much a newbie to VB. Anyway, I need to write a VB app that is called from an HMI application and will bring a second application, already running, to the foreground. Once this occurs, the VB form needs to stay on top of this second application allowing a button for switching back to the original HMI. When this "return button" is pressed, the form/VB app should exit/quit/unload(?).
I have experimenting with the AppActivate command, but there seems to be problems with it performing everytime.
Any help anyone could offer would be greatly appreciated!
Walt Hucks
|
|
|
|
|
Try this API code:
-------- 8< paste on a module 8< ------------------------------------------
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, y, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
Private Const TOPMOST_FLAGS = SWP_NOMOVE Or SWP_NOSIZE
Public Sub MakeNormal(hwnd As Long)
SetWindowPos hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS
End Sub
Public Sub MakeTopMost(hwnd As Long)
SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS
End Sub
-------- 8< paste on a module 8< ------------------------------------------
now, whenever you need it, call MakeTopMost(frmMain.hWnd), and if you need to 'free' the window, not being 'Always on top' anymore, call
MakeNormal(frmMain.hWnd), that´s it!
btw, if you close the app, and you never free-ed the window, nothing happens, in case you are wondering...
Pablo.Ar
PS: I got this code from someone else, of course. Glad to have a chance to pass it along.
|
|
|
|
|
Thanks much for the info! The question I have now though is, where can I find the hwnd for the two different applications? In other words, I assume that you have to reference the handle of the application that you wish to place on top. If I don't have access to the source code, how do I find out what this handle is?
Thanks again for your help!
Walt Hucks
|
|
|
|
|
Never mind my reply to your post... I guess that you meant for that code to be used for my VB form and not necessarily the other two applications that I'm switching between.
But now I would like to know what is the proper way to terminate my VB form/application. The event prompting the closure would be another button click that returns the VB form to "Normal" (or not on top all the time), switches to another application and then closes.
Once again, I appreciate all help.
Walt Hucks
|
|
|
|
|
well, I really don´t follow you that much on what you are trying to achieve, but as much as I understood, I can suggest try coding on this section of the main form:
Form_Terminate()
or
Form_QueryUnload()
those two events are the safest ways to end an app, giving you space to code the final process of the program´s 'normal' termination.
Pablo.Ar
ps:I hope this one helped enough, but I encourage you to re-post with a more specific description of the steps in the problem solving...
|
|
|
|
|
I have a couple sprocs that I wanted to enclose in a transaction. The transaction only has to assure that if one fails they all fail, I don't need to prevent updates or anything of the like, but that is somewhat irrelevant I guess.
The problem is, is that as soon as the trans was put into place it always threw exceptions on the first sproc. I think I will just combine the sprocs together in sql, but I am curious to what I am doing wrong.
Here is the code
<br />
Public Function UpdateFieldErrors(ByRef conn As SqlConnection, ByRef dt As DataTable) As Integer<br />
<br />
'counter of the number of records updated<br />
Dim counter As Integer = 0<br />
Dim corrected_fl As String<br />
Dim trans As SqlClient.SqlTransaction<br />
<br />
'submit all the corrected values and the comments to the database<br />
For Each row As DataRow In dt.Rows<br />
'ensure that the columns that were not corrected were not submitted<br />
Try<br />
'only require a transaction that will allow all to rollback if required<br />
'since there is a lock on the image other users updating or querying<br />
'the data is of no concern<br />
trans = conn.BeginTransaction(IsolationLevel.ReadCommitted)<br />
<br />
Dim cmd As New SqlCommand("dbo.mySproc", conn)<br />
cmd.CommandType = CommandType.StoredProcedure<br />
cmd.Parameters.Add("@err_id", row.Item("err_id"))<br />
cmd.Parameters.Add("@new_value", row.Item("new_value"))<br />
cmd.Parameters.Add("@comments", row.Item("comments"))<br />
<br />
'only set the error to corrected if there is user input in the newvalue field<br />
If row.Item("new_value") = "" Or row.Item("new_value") Is DBNull.Value Then<br />
cmd.Parameters.Add("@corrected_fl", "N")<br />
Else<br />
cmd.Parameters.Add("@corrected_fl", "Y")<br />
End If<br />
<br />
cmd.ExecuteNonQuery()<br />
<br />
'update the answer string containing all the students answers<br />
DbAnswerUpdate.UpdateAnswerString(conn, row)<br />
trans.Commit()<br />
<br />
counter += 1<br />
Catch ex As Exception<br />
trans.Rollback()<br />
MessageBox.Show("Exception occured when inserting one of the updated rows.")<br />
End Try<br />
Next<br />
<br />
dt.AcceptChanges()<br />
<br />
Return counter<br />
<br />
End Function<br />
Thanks for the help
|
|
|
|
|
You forgot to tell us what the Exceptions are and on what lines they are occuring.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
oops I will get those up in a bit, but right now some other changes have to get worked out first. thx
|
|
|
|
|
how can I code the datagrid to reload it every time when the submit button is clicked?
button1_click
???how can I code something in here to tell function results to reload every time when the submit button is clicked?????
results()
end sub
public function results()
Try
objConn.Open()
objDA.SelectCommand = New OleDbCommand
objDA.SelectCommand.Connection = objConn
objDA.SelectCommand.CommandText = "SELECT * from XXX"
objDA.SelectCommand.CommandType = CommandType.Text
objDA.SelectCommand.ExecuteNonQuery()
objDA.Fill(objDS, "XXX")
objConn.Close()
Catch ex As Exception
MessageBox.Show("fail connection")
End Try
grdResults.DataSource = objDS
grdResults.DataMember = "XXX"
end function
Lisa
|
|
|
|
|
I'm using a network stream to send data but don't how to recieve it efficently. Reading data from the stream assumes knowing data is there. How do I know when data is waiting to be read?? Is a event triggered when data is able to be recieved??
Thanks
|
|
|
|
|
The NetworkStream object doesn't fire any events. You have to poll the DataAvailable property of the NetworkStream object to see if there is something to read.
You can look at this[^] example for a demo of DataAvailable .
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
In retrieving 4000 records (sequential read-only access) from an Oracle 9i database, using Visual Basic 6 and ODBC API functions, I built my business collection object in 6 hours. I noticed that the first 400 records, program execution was fast but it slowly depreciated after that.
I created an object/class to handle retrieval of records using ODBC API.
Cursor.Build
--> rc = SQLDriverConnect(DbHandle, FormWnd, DBConnectStr$, SQL_NTS, ConnectOut, 1024, ConnectOutLen, SQL_DRIVER_COMPLETE)
--> rc = SQLSetConnectOption(DbHandle, SQL_ACCESS_MODE, SQL_MODE_DEFAULT)
--> rc = SQLSetConnectOption(DbHandle, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF)
--> rc = SQLAllocStmt(gDatabase.DbHandle, hstmt)
--> rc = SQLSetStmtOption(hstmt, SQL_CURSOR_TYPE, SQL_CURSOR_FORWARD_ONLY)
--> rc = SQLSetStmtOption(hstmt, SQL_CONCURRENCY, SQL_CONCUR_READ_ONLY)
--> rc = SQLSetStmtOption(hstmt, SQL_ROWSET_SIZE, 1)
--> rc = SQLExecDirect(hstmt, Statement, Len(Statement))
Cursor.Read
--> rc = SQLGetData(hstmt, tiColNo + 1, SQL_C_CHAR, tsBuffer$, NoChars, cbtsBuffer)
--> rc = SQLFetch(gDatabase.hstmt)
Business Collection
Set aCursor = New Cursor
if aCursor.Build > 0 then
With aCursor
While .Read
Set aBusiness = New Business Class
aBusiness.Property(1) = .ReturnValue(1)
...
aBusiness.Property(50) = .ReturnValue(50)
cBusiness.Add Item:=Business
Set aBusiness = Nothing
Wend
End With
End If
Set aCursor = Nothing
But if instead of using the cursor object/class, I used the ODBC API functions directly, I built my business collection object in 6 minutes. What could have caused this difference in execution time?
|
|
|
|
|
hi all,
i now facing the problem to convert the hexadecimal to decimal. anybody knowing it? the following are the example:-
Text1.Text = Hex(Int(PrintTAZC(1)))
Text2.Text = Hex(Int(PrintTAZC(2)))
Text3.Text = Text1.Text + Text2.Text
Text4.Text =
The Text4 textbox will display the result of the convertion in decimal of the Text3.Text. Text3.Text is in hexadecimal form.
|
|
|
|
|
Your question is a little vague. Are your trying to add two numbers or is TextBox3 support to have TextBox2 appended to TextBox1, the result showing in Hex in TextBox3 and the Decimal verison in TextBox4?
The code as you posted will append, not add!, TextBox2 to TextBox1 and show the result in TextBox3. The code to convert that result to Decimal and show it in TextBox4 is easy enough:
Text1.Text = Hex(Int(PrintTAZC(1)))
Text2.Text = Hex(Int(PrintTAZC(2)))
Text3.Text = Text1.Text + Text2.Text
Text4.Text = Val( "&H" & Text3.Text )
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Thanks for ur help. I oledi try it by using ur example in my program, it are success to running. Thanks a lot...........
|
|
|
|
|
Dear Sir/Madam,
I have developed on vb app and I would like to run it as a windows service. I used srvany.exe to make it as service. when I make it as a service and try to start the service it is giving message like "windows is started your service but windows stop your service automatically if there is no use of this servic."
|
|
|
|
|