|
5121
|
Programación / .NET (C#, VB.NET, ASP) / Re: Leer datos de una tabla html
|
en: 18 Junio 2015, 21:55 pm
|
Es más, se me ocurre que también se podría usar ChrW(13). El mismo "error" de nuevo. puedes utilizar la función Convert.ToChar. pero si uso vbCrlf ¿tampoco pasa nada no?. Quiero decir, que no afecta en nada al programa, supongo. No, en realidad no pasa nada ...o según se mire, los wrappers de vb6 siguen siendo puro código .Net, pero la razón de que existan es por compatibilidad, esto quiere decir que un buen día podrían dejar de existir, pero, yo te lo comento más que nada por que simplemente el hecho de recurrir a las viejas técnicas o nombres de funciones de VB6 no es algo bueno ya que de alguna manera te estancas en esa tecnología de hace ya casi 2 décadas, y entonces no sigues buenas prácticas de programación en .Net, ya que esto es .Net, no VB6, y, aunque de todas formas sea puro código .Net cómo ya he dicho, si vieras el código fuente de esos wrappers (mediante Reflection) es bastante horrible en comparación con el resto de sus equivalentes funciones built-in que no forman parte del namespace Microsoft.VisualBasic, por ende, te recomiendo no utilizar practicamente ningún miembro que forme parte del namespace Microsoft.VisualBasic, es decir, ningún nombre de función que conozcas de Vb6 plus las constantes y todo eso, ya que todo tiene su equivalente en otras clases más "seguras" y optimizadas de .Net. PD: En mi opinión, es una mala costumbre que les pasa a muchas personas, bien por que hacen la transición de vb6 a .net y preservan sus costumbres, o también a iniciados en VB.Net que hacen copy/pastes de Google, ya que en la mayoría de respuestas que encuentres en Google solo verás morralla vb6-estilizada de programadores que siguen este tipo de prácticas con VB.Net. Saludos!
|
|
|
5123
|
Foros Generales / Foro Libre / Re: ¿Quién es tu sensei?
|
en: 17 Junio 2015, 21:23 pm
|
Elektro, kub0x, números, Shell Root, WHK, Elektro, MinusFour, #dvry, .:UNDER:., engel lex y por supuesto el-brujo, y quizás más que no tuve la oportunidad de observar y conocer. Todos ellos son talentosos devs. Que bien, yo salgo dos veces, ¡y el resto no!, chuparos esa!!, soy con diferencia el más sabio de los aquí presentes ...(por supuesto que NO, ni de coña xD).
Este tipo de posts nunca me han gustado, solo consiguen calificar a unos pocos y dejar en el olvido a otros que tanto se merecen ser nombrados cómo el resto, cada uno tiene conocimientos de algún tipo distintos, es imposible clasificar por "sabio" a las personas de este foro, todos son sabios en un sentido o en otro. Cualquiera de los helper-users que estamos acostumbrados a ver cómo por ejemplo al grande Gus Garsaky que he citado, o cualquiera del staff de elhacker es un buen ejemplo a seguir, ¿qué pasa por ejemplo son Simorg, Aprendiz-oscuro, y el resto que tienen amplios conocimientos de Hardware que ni de lejos tendremos nosotros?, cada uno cuenta en sabiduría. Saludos!
|
|
|
5124
|
Programación / .NET (C#, VB.NET, ASP) / Re: Leer datos de una tabla html
|
en: 17 Junio 2015, 15:32 pm
|
He encontrado esta forma usando System.Windows.Forms.HtmlDocument y algo tan viejo como la función InStr. El código que has mostrado está bastante vb6-estilizado. En lugar de la función InStr, puedes utilizar la función String.IndexOf() En lugar de la constante vbCrLf, puedes usar la constante ControlChars.CrLf Saludos!
|
|
|
5125
|
Foros Generales / Foro Libre / Re: ¿Quién es tu sensei?
|
en: 17 Junio 2015, 15:12 pm
|
Torbe, de ese si que se puede aprender cómo hacerle un poco de ingeniería inversa a la vida para convertirla en un paraiso, siendo muy feo y empezando desde la nada. Los conocimientos de todos los moderadores de Ing. Inversa me fascinan, ya que yo no me he desarrollado bien en ese aspecto, pero de entre los habituales de esa sección del foro, los conocimientos de un usuario llamado Mad Antrax sobre el cheating me asombran, aunque es un hueso muy duro de roer.Saludos!
|
|
|
5126
|
Programación / .NET (C#, VB.NET, ASP) / Re: ¿Compronar la firma de una función P/Invoke en tiempo de ejecución?
|
en: 17 Junio 2015, 04:02 am
|
Analizando bastante a fondo la TEDIOSA class MethodInfo descubrí cómo resolverlo: Dim isSetLastError As Boolean = CType(expr.Body, MethodCallExpression).Method.GetCustomAttributes(False). OfType(Of DllImportAttribute)().FirstOrDefault.SetLastError
EDITO:Os dejo el método genérico si quereis testearlo, es simplemente el inicio de una solución todo-en-uno para ahorrar toneladas de repetición de escritura de código para llevar a cabo la misma tarea, y cómo tal puede no ser perfecto, de hecho no lo es, es imposible hacer una función de este estilo que sea "compatible" con la magnitud de funciones de la WinAPI, ya que la función GetLastError depende de la función "X" que haya sido llamada, en la que algunos casos no tiene por que devolver "0" para una salida exitosa, pero si estamos seguros del valor de retorno de las funciones que usemos entonces si que es bueno usarlo. ''' ---------------------------------------------------------------------------------------------------- ''' <remarks> ''' Title : SafePInvoke ''' Author: Elektro ''' Date : 17-June-2015 ''' </remarks> ''' ---------------------------------------------------------------------------------------------------- ''' <summary> ''' Invokes the specified encapsulated function, trying to provide a higher safety level for error-handling. ''' If the function that was called using platform invoke has the <see cref="DllImportAttribute.SetLastError"/>, ''' then it checks the exit code returned by the function, and, if is not a success code, throws a <see cref="Win32Exception"/>. ''' </summary> ''' ---------------------------------------------------------------------------------------------------- ''' <typeparam name="T"></typeparam> ''' ''' <param name="expr"> ''' The encapsulated function. ''' </param> ''' ''' <param name="refResult"> ''' The referenced result variable. ''' </param> ''' ---------------------------------------------------------------------------------------------------- ''' <returns> ''' The type of the return value depends on the function definition. ''' </returns> ''' ---------------------------------------------------------------------------------------------------- ''' <exception cref="Win32Exception"> ''' Function 'X' thrown an unmanaged Win32 exception with error code 'X'. ''' </exception> ''' ---------------------------------------------------------------------------------------------------- <DebuggerStepThrough> Private Shared Function SafePInvoke(Of T)(ByVal expr As Expression(Of Func(Of T)), Optional ByVal successCode As Integer = 0) As T Dim result As T = expr.Compile.Invoke() Dim method As MethodInfo = CType(expr.Body, MethodCallExpression).Method Dim isSetLastError As Boolean = method.GetCustomAttributes(inherit:=False). OfType(Of DllImportAttribute)().FirstOrDefault.SetLastError If isSetLastError Then Dim exitCode As Integer = Marshal.GetLastWin32Error If exitCode <> successCode Then Throw New Win32Exception([error]:=exitCode, message:=String.Format("Function '{0}' thrown an unmanaged Win32 exception with error code '{1}'.", method.Name, CStr(exitCode))) End If End If Return result End Function
Ejemplos de uso ...parciales: Dim length As Integer = SafePInvoke(Function() NativeMethods.GetWindowTextLength(hWnd))
Dim sb As New StringBuilder(String.Empty, length) SafePInvoke(Function() NativeMethods.GetWindowText(hWnd, sb, sb.Capacity + 1))
Saludos!
|
|
|
5127
|
Programación / .NET (C#, VB.NET, ASP) / ¿Comprobar la firma de una función P/Invoke en tiempo de ejecución?
|
en: 17 Junio 2015, 03:13 am
|
Cómo dice el título del tema, ¿alguien tiene puñetera idea de si es posible, tal vez mediante Reflection, cómo se puede comprobar los valores de los atributos de una firma de una declaración de invocación de plataforma?. [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] private static extern int xxx();
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> Private Shared Function xxx() As Integer End Function
Basicamente necesito comprobar el valor de SetLastError en tiempo de ejecución, para determinar si es True o es False, pero parece un misterio sin resolver. ¿Alguien sabe de alguna referencia oficial de MSDN donde expliquen este detalle tan específico?, ¿cómo obtener los metadatos del método?. Es para mejorar la lógica de este método genérico, ya que sin poder determinar ese detalle que me falta, no sirve para nada realizar un checkeo: ''' <summary> ''' Invokes the encapsulated function, Tthen checks the exit code returned by the function that was called using platform invoke ''' that has the <see cref="DllImportAttribute.SetLastError"/> flag set. ''' </summary> ''' ---------------------------------------------------------------------------------------------------- ''' <exception cref="Win32Exception"> ''' Function 'X' thrown an unmanaged Win32 exception with error code 'X'. ''' </exception> ''' ---------------------------------------------------------------------------------------------------- Private Shared Sub SafePInvoke(Of T)(ByRef refResult As T, ByVal expr As expression(Of Func(Of T))) refResult = expr.Compile.Invoke() Dim exitCode As Integer = Marshal.GetLastWin32Error If exitCode <> 0 Then Throw New Win32Exception([error]:=exitCode, message:=String.Format("Function '{0}' thrown an unmanaged Win32 exception with error code '{1}'.", CType(expr.Body, MethodCallExpression).Method.Name, CStr(exitCode))) End If End Sub
Saludos!
|
|
|
5128
|
Programación / .NET (C#, VB.NET, ASP) / Re: Librería de Snippets para VB.Net !! (Compartan aquí sus snippets)
|
en: 16 Junio 2015, 13:03 pm
|
¿Habeis sentido alguna vez la necesidad de mover una o varias filas de un DataGridView preservando el valor de algunas celdas en el transcurso?, pues yo si, así que comparto este código rehusable que me parece bastante sofisticado para llevar a cabo esa tarea, soporta multi-selección de filas, pero es para manipular directamente las filas de un DataGridViev, no el datasource. Ejemplo de uso: Me.DataGridView1.MoveSelectedRows(DataGridViewMoveRowDirection.Up)
Me.DataGridView1.MoveSelectedRows(DataGridViewMoveRowDirection.Up, {0, 2})
Código fuente: ' *********************************************************************** ' Author : Elektro ' Modified : 16-June-2015 ' *********************************************************************** ' <copyright file="DataGridViewExtensions.vb" company="Elektro Studios"> ' Copyright (c) Elektro Studios. All rights reserved. ' </copyright> ' *********************************************************************** #Region " Option Statements " Option Strict On Option Explicit On Option Infer Off #End Region #Region " Imports " Imports System.Runtime.CompilerServices Imports System.Windows.Forms #End Region ''' <summary> ''' Contains two methods for moving DataRows up/down. ''' You could easily tweak the code to work for say a ListBox. ''' </summary> ''' <remarks></remarks> Public Module DataGridViewExtensions #Region " Enumerations " ''' <summary> ''' Specifies a direction to move the rows. ''' </summary> Public Enum DataGridViewMoveRowDirection As Integer ''' <summary> ''' Move row up. ''' </summary> Up = 0 ''' <summary> ''' Move row down. ''' </summary> Down = 1 End Enum #End Region #Region " Public Methods " ''' <summary> ''' Moves up or down the selected row(s) of the specified <see cref="DataGridView"/>. ''' </summary> ''' <param name="sender">The <see cref="DataGridView"/>.</param> ''' <param name="direction">The row-move direction.</param> <DebuggerStepThrough()> <Extension()> Public Sub MoveSelectedRows(ByVal sender As DataGridView, ByVal direction As DataGridViewMoveRowDirection) DoRowsMove(sender, direction) End Sub ''' <summary> ''' Moves up or down the selected row(s) of the specified <see cref="DataGridView"/>. ''' </summary> ''' <param name="sender">The <see cref="DataGridView"/>.</param> ''' <param name="direction">The row-move direction.</param> ''' <param name="preserveCellsIndex">A sequence of cell indexes to preserve its cell values when moving the row(s).</param> <DebuggerStepThrough()> <Extension()> Public Sub MoveSelectedRows(ByVal sender As DataGridView, ByVal direction As DataGridViewMoveRowDirection, ByVal preserveCellsIndex As IEnumerable(Of Integer)) DoRowsMove(sender, direction, preserveCellsIndex) End Sub #End Region #Region " Private Methods " ''' <summary> ''' Moves up or down the selected row(s) of the specified <see cref="DataGridView"/>. ''' </summary> ''' <param name="dgv">The <see cref="DataGridView"/>.</param> ''' <param name="direction">The row-move direction.</param> ''' <param name="preserveCellsIndex">Optionally, a sequence of cell indexes to preserve its cell values when moving the row(s).</param> <DebuggerStepThrough()> Private Sub DoRowsMove(ByVal dgv As DataGridView, ByVal direction As DataGridViewMoveRowDirection, Optional ByVal preserveCellsIndex As IEnumerable(Of Integer) = Nothing) ' Keeps tracks of a cell value to preserve, to swap them when moving rows. Dim oldCellValue As Object Dim newCellValue As Object ' Short row collection reference. Dim rows As DataGridViewRowCollection = dgv.Rows ' Keeps track of the current row. Dim curRow As DataGridViewRow ' The maximum row index. Dim lastRowIndex As Integer = If(dgv.AllowUserToAddRows, rows.Count - 2, rows.Count - 1) ' List of hash codes of the selected rows. Dim selectedRows As New List(Of Integer) ' Get the hash codes of the selected rows For i As Integer = 0 To (rows.Count - 1) If (rows(i).IsNewRow = False) AndAlso (rows(i).Selected) Then selectedRows.Add(rows(i).GetHashCode) rows(i).Selected = False End If Next i ' Move the selected rows up or down. Select Case direction Case DataGridViewMoveRowDirection.Up For i As Integer = 0 To lastRowIndex If Not rows(i).IsNewRow Then If (selectedRows.Contains(rows(i).GetHashCode)) AndAlso (i - 1 >= 0) AndAlso (Not selectedRows.Contains(rows(i - 1).GetHashCode)) Then curRow = rows(i) rows.Remove(curRow) rows.Insert(i - 1, curRow) If preserveCellsIndex IsNot Nothing Then For Each cellIndex As Integer In preserveCellsIndex oldCellValue = curRow.Cells(cellIndex).Value newCellValue = rows(i).Cells(cellIndex).Value rows(i).Cells(cellIndex).Value = oldCellValue curRow.Cells(cellIndex).Value = newCellValue Next cellIndex End If End If End If Next i Case DataGridViewMoveRowDirection.Down For i As Integer = lastRowIndex To 0 Step -1 If Not rows(i).IsNewRow Then If (selectedRows.Contains(rows(i).GetHashCode)) AndAlso (i + 1 <= lastRowIndex) AndAlso (Not selectedRows.Contains(rows(i + 1).GetHashCode)) Then curRow = rows(i) rows.Remove(curRow) rows.Insert(i + 1, curRow) If preserveCellsIndex IsNot Nothing Then For Each cellIndex As Integer In preserveCellsIndex oldCellValue = curRow.Cells(cellIndex).Value newCellValue = rows(i).Cells(cellIndex).Value rows(i).Cells(cellIndex).Value = oldCellValue curRow.Cells(cellIndex).Value = newCellValue Next cellIndex End If End If End If Next i End Select ' Restore selected rows. For i As Integer = 0 To (rows.Count - 1) If Not rows(i).IsNewRow Then rows(i).Selected = selectedRows.Contains(rows(i).GetHashCode) End If Next i End Sub #End Region End Module
Saludos!
|
|
|
|
|
|
|