|
hi,
my test code debug-results are not spectacular, but difficult to understand :
Error Code: 0
retval: 1241740
status01: 0
status02: 0
status03: 0
status04: 0
//sign of life; debug-prints form the dll:
Hello Command01!
mode: 1
Dumped sm_idle command code: 03 14 01 16
Dumped sm_idle answer code: 03 14 01 16
Das Programm "[2248] WindowsApplication2.exe" wurde mit Code 0 (0x0) beendet.
I also tried the marshal "ptrToStructure" method (source: codeproject/adnan samuel - marshaling structures) :
Imports System.Runtime.InteropServices
< StructLayout(LayoutKind.Sequential)> _
Public Structure rc_status
Dim status01 As Integer
Dim status02 As Integer
Dim status03 As Integer
Dim status04 As Integer
End Structure
Declare Function command01 Lib "lcomp.dll" Alias "command01" ( _
ByVal lc_serialHandle As Integer, _
ByVal mode As Integer, _
ByRef lc_status As IntPtr) _
As Integer
Public Function test(ByVal hSerial As Integer, ByVal iMode As Integer)
Dim retval_int As Integer
Dim retval_ptr As IntPtr
Dim arg_ptr As IntPtr
Dim sStatus As rc_status = New rc_status()
Dim rc_sStatus As rc_status = New rc_status()
Dim gh As GCHandle = GCHandle.Alloc(sStatus, GCHandleType.Pinned)
arg_ptr = gh.AddrOfPinnedObject()
Console.WriteLine("arg_ptr before command01: {0}", arg_ptr.ToString)
retval_int = command01(hSerial, 1, arg_ptr)
Console.WriteLine("arg_ptr after command01: {0}", arg_ptr.ToString)
retval_ptr = New IntPtr(retval_int)
sStatus = CType(Marshal.PtrToStructure(arg_ptr, GetType(rc_status)), rc_status)
rc_sStatus = CType(Marshal.PtrToStructure(retval_ptr, GetType(rc_status)), rc_status)
Console.WriteLine("rc_sStatus:")
Console.WriteLine("status01 : {0}", rc_sStatus.status01.ToString)
Console.WriteLine("status02 : {0}", rc_sStatus.status02.ToString)
Console.WriteLine("status03 : {0}", rc_sStatus.status03.ToString)
Console.WriteLine("status04 : {0}", rc_sStatus.status04.ToString)
Console.WriteLine("sStatus:")
Console.WriteLine("status01 : {0}", sStatus.status01.ToString)
Console.WriteLine("status02 : {0}", sStatus.status02.ToString)
Console.WriteLine("status03 : {0}", sStatus.status03.ToString)
Console.WriteLine("status04 : {0}", sStatus.status04.ToString)
Debug.WriteLine("Error Code: " & Marshal.GetLastWin32Error)
End Function
//Debug prints:
arg_ptr before command01: 18494748
'WindowsApplication2.exe': 'c:\windows\assembly\gac\system.xml\1.0.3300.0__b77a5c561934e089\system.xml.dll' geladen, keine Symbole geladen.
arg_ptr after command01: 18494748
rc_sStatus:
status01 : 18494748
status02 : 1
status03 : 60368552
status04 : 1241784
sStatus:
status01 : 0
status02 : 0
status03 : 0
status04 : 0
Error Code: 0
//sign of life; debug-prints form the dll:
Hello Command01
mode: 1
Dumped sm_idle command code: 03 14 01 16
Dumped sm_idle answer code: 03 14 01 16
Das Programm "[996] WindowsApplication2.exe" wurde mit Code 0 (0x0) beendet.
I have a lot of functions like "command01" I need to use in the dll,
but "command01" ist the only func, with "rc_status" as return value.
Therefore the sStatus argument is much more important to me!
So Progload,
hope to hear from you, or other experts,
best regards,
Daniel
PS:
Prize is a bottle best, original beer from germany,
named "Tannenzäpfle"!
|
|
|
|
|
YuccaTree,
I don't see any reason you would have to pin the memory,
Give this a try,
Private Sub test(ByVal hSerial As Integer, ByVal iMode As Integer)
Dim retval As Integer
Dim sStatus As rc_status = New rc_status
Dim iSSize As Int32 = Marshal.SizeOf(sStatus)
Dim rStatus As IntPtr = Marshal.AllocHGlobal(iSSize)
'Marshal data from a managed object, to an
'unmanaged block of memory
Marshal.StructureToPtr(sStatus, rStatus, False)
' Call lc_command01
retval = lc_command01(hSerial, iMode, rStatus)
Debug.WriteLine("Error Code: " & Marshal.GetLastWin32Error())
'Marshal data from an unmanaged block of
'memory to a managed object.
Marshal.PtrToStructure(rStatus, sStatus)
'/// Do whatever with retval and sStatus here ---
Debug.WriteLine("status01: " & sStatus.status01)
Debug.WriteLine("status02: " & sStatus.status02)
Debug.WriteLine("status03: " & sStatus.status03)
Debug.WriteLine("status04: " & sStatus.status04)
'///---------------------------------------------
'Free the block of memory
Marshal.FreeHGlobal(rStatus)
End Sub
|
|
|
|
|
Hi,
tried the new code with the result:
Error Code: 0
status01: 0
status02: 0
status03: 0
status04: 0
Maybe it's because of the double pointer?
EXPORT struct rc_status *command01 (struct serialHandle *h, int mode, _ struct rc_status **status);
PS:
I had to build a class "rc_status" because
Marshal.PtrToStructure(rStatus, sStatus)
won't work:
< StructLayout(LayoutKind.Sequential)> _
Public Class rc_status
Private m_status01 As Integer
Private m_status02 As Integer
Private m_status03 As Integer
Private m_status04 As Integer
Property status01() As Integer
....
Property status02() As Integer
....
Property status03() As Integer
....
Property status04() As Integer
End Class
hope to hear from you,
best regards,
daniel
|
|
|
|
|
YuccaTree,
If anything should have worked building structure class should have, if you had it referenced ByRef, are you sure your .dll is exporting the values?
The only other thing can think of is allocating that memory as Task memory as it may be doing this:
Microsoft:
"Case of unmanaged method that expects pointer-to-pointer-to-structure. It expects the pointer to be passed in a stack, and that that pointer points to another pointer which is somewhere in memory. And that pointer actually points to actual structure. So these methods expect actually two levels of indirection. So in cases when a method expects two level of indirections there is again two options you can use. The first one, you declare a structure as a class, and then pass it by reference. Since managed class already contains one level of interaction using ref keyword will add additional level of indirection. So now you have two levels of indirection, which is exactly what unmanaged method expects."
"This looks fine, but there is one problem with this. This is related to memory manipulation I was talking about a little bit earlier, which is if this semantics of this third method is that it expects structure to be passed in, and then it will maybe free this memory, allocate new structure, and then point this pointer to newly allocated structure. There will be a problem unless unmanaged method works like that, so it uses co-task mem alloc and co-task mem free for allocation and de-allocation, because that’s exactly what intro marshaler is expecting."
Ref:
http://msdn.microsoft.com/msdntv/transcripts/20030424NETFXSKTranscript.aspx
I'm running out of ideas here, Is there any way for me to get the full code and that .dll via my email link?
progload
Send me an email via my link, I'll reply to it so you'll be able to send it to it.
-- modified at 12:46 Monday 13th February, 2006
|
|
|
|
|
My main form is undergoing a processes in Shell,
I have write a form, contains only a label for some words, before the shell run.
After the processes finish, form.close, form.dispose, form = nothing is seted.
However, I find the form doesn't shown the content, just like the application is hanging.
I have tried to using thread.sleep(2000), still like before but 2 seconds more long.
How can I show a "now loading" form when processing the shell command?
The reason that cannot use the msgbox is process on my main form will be stopped, so I cannot using msgbox, I just wanna send a text for the user, It is processing, need to wait.
|
|
|
|
|
Not sure if this is the best solution - (comments from others welcome) but you can show the Second form on a new thread:
Private Sub Button1_Click(ByVal sender ...EventArgs) Handles Button1.Click
Dim thrShowWait As New System.threading.Thread(AddressOf ShowSplashForm)
thrShowWait.Start()
'
'Execute your Shell commands here
'
thrShowWait.Abort()
thrShowWait = Nothing
End Sub
Private Sub ShowSplashForm()
Dim Splash As New frmSplash 'Form showing "Please Wait..."
'set frmSplash FormBorderStyle to 'None' so user cant close it
Splash.ShowDialog()
End Sub
|
|
|
|
|
You don't need a seperate thread if all your doing is putting up something like a messagebox. Keep in mind that this MessageBox form will NOT, and SHOULD NOT, launch your external app. All it's there for is to put up something for the user to look at. The form that creates and shows this MessageBox form should also be launching the external app.
Public Class myMessageBox
Inherits System.Windows.Forms.Form
Private Sub myMessageBox_Load(blah, blah) Handles blah
Label1.Text = "Loading...."
Me.TopMost = True
End Sub
End Class
' In your Form1 (or whatever you call it) code...
Dim myMB As New myMessageBox()
myMB.Show()
Application.DoEvents() ' This will make sure that your new messagebox will get painted
' Launch your external app here...
myMB.Dispose()
' Done!
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
I do it like this,
But the message form us just like hanging,
I mean the content of form is transparent.
How can I make it better.
|
|
|
|
|
Did you put the Application.DoEvents() line in BEFORE you launched your external app?
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
|
Just for anyone else reading this thread, the Application.DoEvents() line was in the sample code I originally posted.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Wow, I got It!!
Thank you again!!
|
|
|
|
|
Hi I am making a windows service that monitors a folder and transfer the files created in that folder to another folder on the network.
I put the following in the OnStart routine:
xtr = New Xml.XmlTextReader("e:\setup.xml")
While xtr.Read
If xtr.NodeType = Xml.XmlNodeType.Element Then
If xtr.Name = "Target" Then
xtr.Read()
s_path = xtr.Value
ElseIf xtr.Name = "Dest" Then
xtr.Read()
d_path = xtr.Value
End If
End If
End While
I put the source folder to be monitored and the destination folder to copy to in the XML file, and set the value of s_path and d_path accordingly.
The problem is that when I start the service it just stop immediately. But if i set the value of s_path and d_path to something else before the first line of the above code, and set the values that correspond to the xml file when the above code run, the windows service start sucessfully.
The XML is created correctly cuz I have tested it with a VB Windows application with the same code as above. Does anyone know why that happen?
|
|
|
|
|
chiyinhk wrote: The problem is that when I start the service it just stop immediately.
Typically, a service is written to, on start, startup a seperate processing thread that continuously loops and looks for work to do. This has to be done as a seperate thread because if you put that looping code into the OnStart method of your service, there will never be a return from this method and the ServiceControl manager will think there is something wrong because it's waiting for a return code that it will never get.
In your case, you're just running a block of code that has an ending point and returns, something like the code you would put in a Load event in a Windows Forms app. You're not starting a thread to do the actual processing.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
How can I change reports and data sources for ReportViewer on runtime?
|
|
|
|
|
Hi All!,
I've a problem in copying files to a network computer using vb.net coding. I want to copy some files to another computer in a network(LAN). can anyone please tell me how to do this. the IP address of the network computer is 130.1.1.24.
thanx,
Prasant
|
|
|
|
|
Well, without knowing anything about the machine you want to copy files to, we can only guess at what you need to do. And DO NOT post IP addresses for your internal network in a public forum! This is a HUGE security breach and could get you fired!!!!!
What type of server is this machine you want to copy files to? Windows Server, Novell, Linux, FTP server, web server, ..., ???
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Hi,
Thanx for your advice. As per your instruction i'm giving my problem in detail. actually i'm using windows 2003 server. i've my files stored in the server in a folder say x. i want to copy all the files of x folder to a pc(say mypc) connected in a lan.
please suggest any solution for the problem.
thanx in advance,
Prasant
|
|
|
|
|
Then you're looking for the File class and it's Shared .Copy() method. All you need to supply are the source filepaths and the destination.
File.Copy(sourceFilePath, destinationFilePath)
Getting to filepaths on are remote machine requires specifying the path in UNC format (\\server\share\filepath), or by drive letter paths (F:\, G:\, ...), if you have a drive mapping to the server share.
File.Copy("\\myServer\MyShare\Folder\Folder\File.txt", "C:\Folder\File.txt")RageInTheMachine9532<font size="-1">
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome</font>
|
|
|
|
|
Hi,
It Really works fine. thanx a lot for your valuable guidance. it really solves my problem. but could please tell me how to copy/download files from ftp.
the problem is i've a ftp(say ftp.xxx.com). i know the host name and ftp port id, username and password but i don't know the ip address. all i need is i want to copy the files from ftp to a machine say yy. i'm using ftp component but please anyone tell me how to use it in a proper way to solve my problem.
thanx,
Prasant
|
|
|
|
|
Prasant_Panda wrote: i'm using ftp component but please anyone tell me how to use it in a proper way to solve my problem
What/Who's FTP component? Without knowing this, it's hard to give you any kind of accurate instructions.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Hi,
As per your instruction i'm giving you details. i've downloaded one ftp component for vb.net from codeguru.com. and i'm writing codes as follows.
Imports FTP
'Code In The Button click event
Dim NewFtp as Ftp.clsftp
NewFtp = New clsFTP
NewFtp.RemoteHost = "ftp.xxxxx.xxx"
NewFtp.RemotePort = xx
NewFtp.RemoteUser = "xxxx"
NewFtp.RemotePassword = "xxxx"
NewFtp.Login()
The problem is when i run this program it gives me error "no such host is known".
kindly suggest any solution for it.
thanx,
Prasant
|
|
|
|
|
It's telling you that either the host name you gave it doesn't exist or it's not responding on the port number yuo gave it. By default, FTP works on port 21. I'm not familiar with that component, so it might be that it requires the host name be in a specific format also. You'll have to check with any documentation that come with the component.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
VB.Net/MS Access. I need to insert records into a particular table (say X)after getting the data from two different tables (say A & B) and doing some permutations and combinations on it. I am getting entire data from tables A & B into two different Datasets. A loop has been written to parse the records from A (dataset), check in B(dataset) and insert the record in table C. However, this entire process is taking a long time. (i.e: in my test run, to insert around 8 lakh records, it took approx 4 hrs).
As per my perception, the time delay is being caused since I am firing an insert statement directly on the database during every loop cycle. Is there a way to avoid this and speed up the process. (i.e. Can the records be inserted into a dataset and then all the records be directly inserted into the table from the dataset)
I am providing sample code for your reference.
Code :
----------------------------------------------------------------------------
str = "select id, code, name, period from EMP2000"
ipcon.Open()
DA = New OleDbDataAdapter(str, ipcon)
DS = New DataSet
DA.Fill(DS, "irec")
str2 = "select id, code, addr, period from EMPADDR"
DA2 = New OleDbDataAdapter(str2, ipcon)
DS2 = New DataSet
DA2.Fill(DS2, "imsctrl")
DV = New DataView(DS2.Tables("imsctrl"))
str3 = "select Id, code, name, addr from EMPDATA where period = '2000'"
DA3 = New OleDbDataAdapter(str3, ipcon)
DS3 = New DataSet
DA3.Fill(DS3, "emp")
Dim cb As New OleDbCommandBuilder(DA3)
Dim cnt As Integer
cnt = 0
'''
Dim DataRow As DataRow
For Each myrow In DS.Tables("irec").Rows
If (myrow(1).Equals(System.DBNull.Value)) Then
code1 = ""
Else
code1 = myrow(1)
End If
If (myrow(3).Equals(System.DBNull.Value)) Then
period1 = ""
Else
period1 = myrow(3)
End If
If (myrow(2).Equals(System.DBNull.Value)) Then
name1 = ""
Else
name1 = myrow(2)
End If
For Each DataRow In DV.Table.Rows
If Trim(DataRow(1)) = Trim(code1) And Trim(DataRow(3)) = Trim(period1) Then
addr1 = Trim(DataRow(2))
Exit For
End If
Next
dsNewRow = DS3.Tables("emp").NewRow
dsNewRow.Item("code") = Trim(code1)
dsNewRow.Item("name") = trim(name1)
dsNewRow.Item("addr") = Trim(addr1)
DS3.Tables("emp").Rows.Add(dsNewRow)
DA3.Update(DS3, "emp")
Next
----------------------------------------------------------------------------
Is there a way to insert all the records in a dataset and finally update the dataset to the database? If there is such a way then is it really fast. Thnx for your help.
With Best Regards,
Mayur
|
|
|
|
|
This is all something that wound be MUCH faster and better done in the database itself using straight SQL code. This would require completely rewriting this.
For example,
For Each DataRow In DV.Table.Rows
If Trim(DataRow(1)) = Trim(code1) And Trim(DataRow(3)) = Trim(period1) Then
addr1 = Trim(DataRow(2))
Exit For
End If
you're going through each record in a table and looking for records that has 2 fields that match certain requirements and returning that one record. This can be done in a simple SELECT statement:
SELECT addr1 FROM irec WHERE code1=something AND period1=something
This, of course, won't run because I have no idea what your database structure is, but it'll be FAR, FAR faster than you going through each record in a table and comparing things yourself.
You code is just using a database engine for storing data. It's not using the database engine to do any processing! Your code is taking hours to run because you're not using easier and faster methods to process your data. The more you can do in SQL code, the faster this process will go!
This is what I mean by competely scrapping what you have, rethinking your logic, and breaking each step of your logic down to simpler steps. Then you can find faster ways of doing each step. I bet you could do this entire thing in a single stored procedure on an SQL server and it would probably take all of 10 seconds to run (depending on the number of records of course!) To bad Access doesn't support true stored procedures!
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|