|
Mostrar Mensajes
|
Páginas: [1] 2
|
2
|
Programación / .NET (C#, VB.NET, ASP) / Tema oscuro en .NET
|
en: 2 Mayo 2020, 08:11 am
|
Saludos a todos los integrantes del foro. Tengo una aplicación hecha en VB.NET con temas visuales CLARO y OSCURO, la curiosidad que tengo es como puedo detectar el tema de Windows 10 si está en CLARO U OSCURO para poder aplicar a mi programa el mismo tema de Windows 10 desde VB.NET o C#.
Les agradezco de antemano.
|
|
|
3
|
Programación / Programación C/C++ / Re: Funciones por referencia
|
en: 9 Abril 2020, 21:09 pm
|
Primero agradecer a Loretz por su código y a los que administran el foro, por responderme en un tiempo muy corto y por los conceptos que me dan. Se que el lenguaje c++ es un poco complicado cuando uno comienza aun sabiendo otros lenguajes de alto nivel, yo vengo de esos lenguajes de alto nivel, por eso tengo esa curiosidad de profundizar en cuanto a programación, por eso un rato me parece complicado el lenguaje, en ese sentido acudí a este foro y lo cual seguiré haciendo consultas mas adelante. Gracias por ayudarme Saludos.
|
|
|
4
|
Programación / Programación C/C++ / Re: Funciones por referencia
|
en: 9 Abril 2020, 18:41 pm
|
Puedes hacer algo como esto, pero ten en cuenta que en C++ no debes usar punteros, no debes usar new (ni delete). #include <iostream> // para cout #include <cstring> // para strncpy
int NombreFuncion(char* Dato, size_t &BufferDato) { const char* texto = "resultado"; if (BufferDato < strlen(texto)+1) { BufferDato = strlen(texto) +1; return 0; // texto es más largo que BufferDato } strncpy(Dato, texto, BufferDato); Dato[BufferDato-1] = '\0'; return 1; }
int main() { size_t size = 1; char* dato = new char[size]; if (NombreFuncion(dato, size)) std::cout << "dato = " << dato << '\n'; else std::cout << "dato debe ser al menos de " << size << " bytes\n";
delete[] dato; } Gracias Loretz, hice correr el código en dev c++ y todo ok, y tambien probé en el IDE de visual studio 2015 y me salta el error al compilar en la siguiente linea ... strncpy(Dato, texto, BufferDato); ...
El error que se muestra es lo siguiente Error C4996 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
Generalmente yo uso el IDE de visual studio 2015, alguna librería debo incluir? tambien probé con strncpy_s y nada me dice ninguna sobrecarga coincide para la función. Una vez mas gracias por tu respuesta estimado:
|
|
|
5
|
Programación / Programación C/C++ / Funciones por referencia
|
en: 9 Abril 2020, 03:37 am
|
Saludos, Soy casi nuevo en este lenguaje y tengo ganas de profundizar el lenguaje. Quiero hacer una función con dos parámetros el primero por valor y el segundo por referencia, en el primer parámetro quiero recibir texto que la función devuelva. como un ejemplo quiero resaltar la funcion de windows Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, ByRef nSize As Long) As Long
Es similar el resultado que quiero obtener, lo cual en su primer parámetro obtengo el nombre del equipo y el segundo le paso el tamaño de caracteres que debe de rellenar. La función que intento hacer es de esta manera, por favor les agradezco de antemano como lo puedo hacer?. int NombreFuncion(char* Dato, int &BufferDato) { char* texto = "resultado"; Dato = texto;//BufferDato para ver la cantidad de caracteres para el texto return 1; }
Imagino que se debe manejar punteros lo cual tengo varias dudas sobre el manejo de punteros.
|
|
|
6
|
Programación / Programación Visual Basic / ListViewItem
|
en: 17 Noviembre 2018, 00:42 am
|
Estimados: espero que me puedan ayudar, en el listview el metodo ensurevisible hace que se visibilice aun que estaba oculto. ListView2.SelectedItems(0).EnsureVisible()
La consulta es, como puedo saber antes de ejecutar ensurevisible si esta visible o esta oculto. gracias por sus respuestas.
|
|
|
7
|
Programación / .NET (C#, VB.NET, ASP) / Obtener permiso para copiar archivo en c:\archivos de prog..\... en dominio
|
en: 4 Mayo 2018, 22:49 pm
|
Saludos a todos los miembros del grupo, he buscado una solución para mi problema y no encontré mucho en la web por eso quiero exponer mi problema para que me puedan ayudar y también pueda servir para otros que tienen el mismo problema, tengo un sistema en la institución donde debo lanzar nuevas versiones para los clientes mediante el mismo sistema, hasta ahí todo bien, los clientes reciben la notificación de que hay una nueva versión y hacen clic en actualizar en el mismo sistema, el archivo ejecutable de actualización se descarga y ejecuta, pero los clientes están bajo un dominio y les pide usuario y contraseña del administrador (cosa que es normal eso de pedir contraseña), para ejecutar el programita de actualización que nada mas ni menos que hace es copiar y reemplazar el nuevo ejecutable en c:\Archivos de programa\sistema\ejecutable.exe, el detalle es que son varios clientes que están distribuidos geográficamente en distintos lugares, lo que quisiera que el programita de actualización copie y reemplace en su directorio sin que le pida la contraseña del administrador del dominio y para eso como se puede obtener permisos especiales para hacer esa operación. de tanto indagar encontré un código que hace algo parecido pero es para apagar el equipo con privilegios, nota: el programita de actualización, esta en vb net y lo que hace es llevar el nuevo ejecutable como recurso incrustado al mismo, y lo que hace es copiar o reemplazar desde su recurso a la unidad c:\Archivos de programa\sistema\ejecutable.exe en el equipo del cliente Private Const EWX_LOGOFF As Integer = 0 Private Const EWX_SHUTDOWN As Integer = 1 Private Const EWX_REBOOT As Integer = 2 Private Const EWX_FORCE As Integer = 4 Private Const TOKEN_ADJUST_PRIVILEGES As Integer = &H20 Private Const TOKEN_QUERY As Integer = &H8 Private Const SE_PRIVILEGE_ENABLED As Integer = &H2 Private Const ANYSIZE_ARRAY As Integer = 1 Private Const VER_PLATFORM_WIN32_NT As Integer = 2 Private Structure OSVERSIONINFO Dim dwOSVersionInfoSize As Integer Dim dwMajorVersion As Integer Dim dwMinorVersion As Integer Dim dwBuildNumber As Integer Dim dwPlatformId As Integer <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> Dim szCSDVersion As String End Structure Private Structure LUID Dim LowPart As Integer Dim HighPart As Integer End Structure Private Structure LUID_AND_ATTRIBUTES Dim pLuid As LUID Dim Attributes As Integer End Structure Private Structure TOKEN_PRIVILEGES Dim PrivilegeCount As Integer Dim laa As LUID_AND_ATTRIBUTES End Structure Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As IntPtr, ByVal DesiredAccess As IntPtr, ByRef TokenHandle As IntPtr) As Integer Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, ByRef lpLuid As LUID) As Integer Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Int32, ByVal dwReserved As Int32) As Int32 <DllImport("advapi32.dll", SetLastError:=True)> Private Function AdjustTokenPrivileges(ByVal TokenHandle As IntPtr, ByVal DisableAllPrivileges As Boolean, ByRef NewState As TOKEN_PRIVILEGES, ByVal BufferLengthInBytes As Integer, ByRef PreviousState As TOKEN_PRIVILEGES, ByRef ReturnLengthInBytes As Integer) As Boolean End Function <DllImport("Kernel32.dll")> Private Function GetVersionEx(<MarshalAs(UnmanagedType.Struct)> ByRef osinfo As OSVERSIONINFO) As Integer End Function Private Sub EnableShutDown() Dim hProc As IntPtr, hToken As IntPtr, mLUID As LUID, mPriv As TOKEN_PRIVILEGES, mNewPriv As TOKEN_PRIVILEGES hProc = Process.GetCurrentProcess.Handle OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken) LookupPrivilegeValue("", "SeShutdownPrivilege", mLUID) mPriv.PrivilegeCount = 1 mPriv.laa.pLuid = mLUID mPriv.laa.Attributes = SE_PRIVILEGE_ENABLED Call AdjustTokenPrivileges(hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount)) End Sub ' para apagar windows, este codigo hace sin importar el tipo de usuario este en ese momento igual lo apagara si Forzar es True le obliga a apagar 'como se puede obtener similar permiso para copiar el archivo en un windows que pertenece a un dominio? Public Sub ApagarWindows(ByVal Optional Forzar As Boolean = True) Dim Flags As Integer = EWX_SHUTDOWN If Forzar Then Flags = Flags + EWX_FORCE EnableShutDown() ExitWindowsEx(Flags, 0) End Sub
Intente cambiar LookupPrivilegeValue("", "SeShutdownPrivilege", mLUID)
por LookupPrivilegeValue("", "SeRestorePrivilege", mLUID)
que encontré en este link https://foro.elhacker.net/programacion_visual_basic/source_conseguir_privilegios_adjusttokenprivileges-t199668.0.html;wap= pero no hizo ningún efecto o como se puede hacer? De antemano les agradezco por compartir el conocimiento.
|
|
|
8
|
Programación / .NET (C#, VB.NET, ASP) / Re: thread multihilos
|
en: 7 Noviembre 2017, 20:58 pm
|
Bueno agradecerles a nebire y elektro por sus conceptos bien puntualizados, sobre todo en la administración de recursos de un objeto. Les agradezco mucho por haberme despejado dudas sobre programación en net.
|
|
|
9
|
Programación / .NET (C#, VB.NET, ASP) / thread multihilos
|
en: 2 Noviembre 2017, 15:45 pm
|
Que tengan un buen dia a todos los integrantes del foro. Quiero hacerles la consulta, cuando utilizo thread dentro de otro thread se bloquea mi ventana, no se si es bueno aplicar un hilo dentro de otro hilo, si trabajo con un hilo todo bien pero agrego otro hilo dentro de la misma es ahi donde se bloque mi ventana. Tal ves no tenga sentido pero lo que quiero hacer es cargar de un datatable a listview pero con el primer hilo tarda en cargar datos en el listview y por cada fila al agregar un item en listview se tarda pero la idea es acelerar la carga y la idea que tuve es por cada fila en datatable disparar otro hilo y es ahí donde empieza a bloquear mi ventana, pero la carga de datos a listview es rápido. la pregunta es si es conveniente utilizar un hilo dentro de otro o hay otra forma de hacer hilos anidados si que me bloquee mi ventana. El código es lo siguiente para que se me entienda bien... Gracias de antemano por sus respuestas Imports System.Data.SqlClient Imports System.Threading Imports System.ComponentModel <Microsoft.VisualBasic.ComClass()> <ToolboxBitmap(GetType(System.Windows.Forms.ListView))> <System.Serializable()> Public Class ListView Inherits Windows.Forms.ListView Dim thSQL As Thread Dim _sq As String, _decimales As Integer, _EllipseIcon As Boolean, _bordColor As Pen Public Sub SQLConsulta(ByVal sq As String, Optional ByVal EllipseIcon As Boolean = False, Optional ByVal borderColor As Pen = Nothing, Optional ByVal decimales As Integer = 0) _sq = sq : _decimales = decimales : _EllipseIcon = EllipseIcon : _bordColor = borderColor thSQL = New Thread(AddressOf SQLConsultaInterno) thSQL.Start() End Sub Private Sub SQLConsultaInterno() Try Dim h As Thread Dim conexion As SqlConnection = New SqlConnection() conexion.ConnectionString = "Data Source=ip_server,1433;Failover Partner=ip_server2,1433;Network Library=DBMSSOCN;MultipleActiveResultSets=true;Initial Catalog=DB;User ID=sa;Password=contraseña;" : conexion.Open() Dim ds As New DataSet(), da As New SqlDataAdapter(_sq, conexion) : da.Fill(ds, "tabla") If ds.Tables("tabla").Columns.Count = 1 Then For c As Integer = 0 To ds.Tables("tabla").Columns.Count - 1 AddColumn(ds.Tables("tabla").Columns(c).Caption) Next Else For c As Integer = 1 To ds.Tables("tabla").Columns.Count - 1 AddColumn(ds.Tables("tabla").Columns(c).Caption) Next End If With ds.Tables("tabla") For filas As Integer = 0 To .Rows.Count - 1 Dim ob As New ROW ob.fila = .Rows(filas) ob.columnas = .Columns.Count ob.index = filas h = New Thread(AddressOf agregar) h.Start(ob) Next End With conexion.Close() Catch ex As Exception End Try End Sub Private Sub agregar(obj As Object) Dim rw As ROW = DirectCast(obj, ROW) If rw.columnas = 1 Then Dim Registro As New ListViewItem(rw.fila.Item(0).ToString.Trim, rw.index) AddItem(Registro) Else Dim Registro As New ListViewItem(rw.fila.Item(1).ToString.Trim, rw.index) Registro.Tag = rw.fila.Item(0).ToString.Trim For c As Integer = 2 To rw.columnas - 1 Registro.SubItems.Add(rw.fila.Item(c).ToString().Trim) Next AddItem(Registro) End If End Sub Delegate Sub AddColumns(ByVal texto As String) Private Sub AddColumn(ByVal texto As String) If Me.InvokeRequired Then Dim d As New AddColumns(AddressOf AddColumn) Invoke(d, New Object() {texto}) Else Me.Columns.Add(texto) End If End Sub Delegate Sub AddItems(ByVal item As ListViewItem) Private Sub AddItem(ByVal item As ListViewItem) If Me.InvokeRequired Then Dim d As New AddItems(AddressOf AddItem) Invoke(d, New Object() {item}) Else Me.Items.Add(item) End If End Sub Private Class ROW Property fila As DataRow Property columnas As Integer Property index As Integer End Class End Class
|
|
|
10
|
Programación / .NET (C#, VB.NET, ASP) / Re: Agregar mensaje WM_MOUSEMOVE en header de listview
|
en: 21 Agosto 2016, 04:34 am
|
Tambien encontré en la web esta clase para capturar los mensajes de una ventana asignando un handle en el siguiente link https://msdn.microsoft.com/en-us/library/system.windows.forms.nativewindow.assignhandle(v=vs.110).aspxImports System.Runtime.InteropServices Friend Class HeaderControl Inherits NativeWindow <DllImport("user32.dll", EntryPoint:="SendMessage")> Private Shared Function SendMessage(hwnd As IntPtr, wMsg As Integer, wParam As IntPtr, lParam As IntPtr) As IntPtr End Function Private Const LVM_GETHEADER As UInt32 = &H101F Private Const WM_MOUSEMOVE As Int32 = &H200 Public Sub New(LV As ListView) 'Get handle to LV header Dim hWnd_LV_Header As IntPtr = SendMessage(LV.Handle, LVM_GETHEADER, IntPtr.Zero, IntPtr.Zero) If hWnd_LV_Header <> IntPtr.Zero Then Me.AssignHandle(hWnd_LV_Header) AddHandler LV.HandleDestroyed, AddressOf LV_destroy ' To release handle when LV destroyed? End If End Sub Private Sub LV_destroy(sender As Object, e As EventArgs) Me.ReleaseHandle() End Sub ' subclass LV header... Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) Select Case m.Msg Case WM_MOUSEMOVE ' https://msdn.microsoft.com/en-us/library/windows/desktop/ms645616%28v=vs.85%29.aspx ' show mouse location over LV column header Debug. WriteLine("x={0}, y={1}", m. LParam. ToInt32 And &HFFFF &, m. LParam. ToInt32 \ &H10000 And &HFFFF &) ' http://support.microsoft.com/kb/112651 End Select MyBase.WndProc(m) End Sub End Class
Segun lo que entiendo esta clase escucha todos los mensajes del header de listview, y disculpen mi ignorancia estoy aprendiendo el lenguaje vb net, como integro la clase HeaderControl a mi clase Listview que es la siguiente. Public Class ListView Inherits Windows.Forms.ListView Public Sub New() ' End Sub Protected Overrides Sub WndProc(ByRef m As Message) 'mensajes de listview MyBase.WndProc(m) End Sub End Class
Gracias de antemano
|
|
|
|
|
|
|