Transformar Codigo Sencillo de VB6 a C++

Iniciado por revenge1252, 1 Junio 2012, 19:16 PM

0 Miembros y 2 Visitantes están viendo este tema.

revenge1252

Hola, como bien dice el titulo, tengo un codigo en VB6 que me funciona a la perfeccion.

es este:

Public Declare Sub UrlMkSetSessionOption Lib "urlmon.dll" (ByVal dwOption As Long, ByVal pBuffer As String, ByVal dwBufferLength As Integer, ByVal dwReserved As Integer)

Public Function UChange(ByVal Variable As String)
    UrlMkSetSessionOption &H10000001, Variable, Len(Variable), 0
End Function


me preguntaba si alguien me podria ayudar para adaptarlo a C++ 6

Necesito portar-lo y no encuentro el codigo ya hecho para C++, y tampoco se transformarlo yo mismo, seria para una DLL.


Gracias por leer mi post y Saludos!

The Swash

Hola,

Paso de afán a programar la función pero no tuve tiempo de probar bien. En teoría debe funcionar, me cuentas.

Un saludo,
Iván Portilla.

#include <windows.h>
HRESULT (WINAPI * UrlMkSetSessionOption)(DWORD dwOption, LPVOID Buffer, DWORD dwBufferLength, DWORD dwReserved);


DWORD UChange(PCHAR Variable)
{
    HANDLE DLL;
    HRESULT Result;
    DWORD ResultFunc = 0;

    DLL = LoadLibraryA("urlmon.dll");
    UrlMkSetSessionOption = GetProcAddressA(DLL, "UrlMkSetSessionOption");

    if (UrlMkSetSessionOption != NULL)
    {
        Result = UrlMkSetSessionOption(0x10000001, Variable, lstrlenA(Variable), 0);
        if (Result == S_OK)
            ResultFunc = 0;
        else if(Result == E_INVALIDARG)
            ResultFunc = -1;
    }
    else
        ResultFunc = -1;

    return ResultFunc;
}

revenge1252

#2
Hola, ya lo probe, no consigo hacerlo funcionar, siento mi bajo nivel, que probablemente sea la causa de que no funcione...

no entiendo 100% como funciona el codigo que me has dejado.


aun asi intente hacerlo funcionar, este es el codigo entero de mi proyecto:

// WINUS.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include <windows.h>
HRESULT (WINAPI * UrlMkSetSessionOption)(DWORD dwOption, LPVOID Buffer, DWORD dwBufferLength, DWORD dwReserved);


DWORD UChange(PCHAR Variable)
{
   HANDLE DLL;
   HRESULT Result;
   DWORD ResultFunc = 0;

   DLL = LoadLibraryA("urlmon.dll");
   UrlMkSetSessionOption = GetProcAddressA(DLL, "UrlMkSetSessionOption");

   if (UrlMkSetSessionOption != NULL)
   {
       Result = UrlMkSetSessionOption(0x10000001, Variable, lstrlenA(Variable), 0);
       if (Result == S_OK)
           ResultFunc = 0;
       else if(Result == E_INVALIDARG)
           ResultFunc = -1;
   }
   else
       ResultFunc = -1;

   return ResultFunc;
}


int APIENTRY WinMain(HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR     lpCmdLine,
                    int       nCmdShow)
{
// TODO: Place code here.
UChange("LOL")
return 0;
}


y me da los siguientes errores:

--------------------Configuration: WINUS - Win32 Debug--------------------
Compiling...
WINUS.cpp
C:\Program Files (x86)\Microsoft Visual Studio\MyProjects\WINUS\WINUS.cpp(16) : error C2065: 'GetProcAddressA' : undeclared identifier
C:\Program Files (x86)\Microsoft Visual Studio\MyProjects\WINUS\WINUS.cpp(16) : error C2440: '=' : cannot convert from 'int' to 'long (__stdcall *)(unsigned long,void *,unsigned long,unsigned long)'
       Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
C:\Program Files (x86)\Microsoft Visual Studio\MyProjects\WINUS\WINUS.cpp(41) : error C2143: syntax error : missing ';' before '}'
C:\Program Files (x86)\Microsoft Visual Studio\MyProjects\WINUS\WINUS.cpp(41) : warning C4508: 'WinMain' : function should return a value; 'void' return type assumed
Error executing cl.exe.

WINUS.exe - 3 error(s), 1 warning(s)


perdona mi ignorancia, siempre trabaje con VB6, pero para crear esta dll necesito como no c++ y me estoy informando todo lo que puedo pero sigo atascado, por cierto, gracias por responder y por hacerlo tan rapido!

Saludos!

The Swash

Hola,

Creo que me equivoque en unos detalles, aquí te dejo el código que estimo te debe funcionar, pero no tengo Visual Studio, yo lo compilo con MinGW.

Un saludo,
Iván Portilla.

#include <windows.h>
typedef HRESULT (WINAPI* UrlMkSetSessionOption)(DWORD dwOption, LPVOID Buffer, DWORD dwBufferLength, DWORD dwReserved);


DWORD UChange(PCHAR Variable)
{
    HANDLE DLL;
    HRESULT Result;
    DWORD ResultFunc = 0;
    UrlMkSetSessionOption _UrlMkSetSessionOption;

    DLL = LoadLibrary("urlmon.dll");
    _UrlMkSetSessionOption = (UrlMkSetSessionOption)GetProcAddress(DLL, "UrlMkSetSessionOption");

    if (_UrlMkSetSessionOption != NULL)
    {
        Result = _UrlMkSetSessionOption(0x10000001, Variable, lstrlenA(Variable), 0);
        if (Result == S_OK)
            ResultFunc = 0;
        else if(Result == E_INVALIDARG)
            ResultFunc = -1;
    }
    else
        ResultFunc = -1;

    return ResultFunc;
}


int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
// TODO: Place code here.
UChange("LOL");
return 0;
}

revenge1252

Hola, antes de nada, muchisimas gracias por ayudarme, probe el codigo y se depuraron casi todos los errores menos uno, que es este:

--------------------Configuration: SDXD - Win32 Debug--------------------
Compiling...
SDXD.cpp
C:\Program Files (x86)\Microsoft Visual Studio\MyProjects\SDXD\SDXD.cpp(17) : error C2664: 'GetProcAddress' : cannot convert parameter 1 from 'void *' to 'struct HINSTANCE__ *'
        Conversion from 'void*' to pointer to non-'void' requires an explicit cast
Error executing cl.exe.

SDXD.exe - 1 error(s), 0 warning(s)

estoy buscando una solucion, pero por ahora no encuentro nada, supongo que para ti arreglar-lo sera nada y menos, aun asi voy a seguir mirando aver, gracias y saludos!

Eternal Idol

En lugar de:
HANDLE DLL;

Usa:
HMODULE DLL;

Usar UrlMkSetSessionOption tal cual como el typedef no funcionara en SDKs de este siglo donde la funcion existe. Tambien podrias usar enlazado estatico:


Código (c++) [Seleccionar]
#pragma comment(lib, "urlmon")

#include <windows.h>

void UChange(char *user_agent)
{
  UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, user_agent, strlen(user_agent), 0);
}
...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

BlackZeroX

@The Swash: cuando ocupas LoadLibray debes al termino (cuando ya no uses mas la libreria) usar FreeLibrary...

Dulces Lunas!¡.
The Dark Shadow is my passion.

revenge1252

#7
hola de nuevo, antes de nada gracias a todos los que se estan interesando por mi post, en fin, con los varios codigos que me han ido dejando finalmente cree este code:

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib, "urlmon")

HRESULT (WINAPI * UrlMkSetSessionOption)(DWORD dwOption, LPVOID Buffer, DWORD dwBufferLength, DWORD dwReserved);

void UChange(char *user_agent)
{
  UrlMkSetSessionOption(0x10000001, user_agent, strlen(user_agent), 0);
}

BOOL APIENTRY DllMain (HINSTANCE hInst,
DWORD reason,
LPVOID reserved)
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
// AQUI UN TIMER, NO SLEEP
UChange("XDD");
break;
}
return TRUE;
}


Me explico, este code lo que deberia de hacer es cambiar el user agent cuando la dll se inyecta en algun programa que tenga un Webbrowser.

por algun motivo que desconozco, por ahora no funciona, tengo una posible idea de el porque, igual esque el codigo carga tan pronto que no dio tiempo a que cargaran los controles de Webbrowser etc, de modo que no hace ningun efecto el cambio de UA, otra posibilidad esque el code no este bien hecho, lo que estoy seguro de que esta bien hecho es la parte que hace que cargue al ser inyectada la dll, ya que puse un MSGBOX y lo arranco, si fuera cierto lo del tiempo, se me ocurre poner una funcion tipo Sleep para que tarde un rato en cargar, pero Sleep no serviria, ya que "paraliza" toda la carga del programa, tendria que ser algo tipo timer, aver si a alguien le interesa el tema y me hecha una mano.

Saludos!


PD: intente usar la funcion Uchange desde VB6, pero no funciona tampoco..., lo intente para descartar la posibilidad de que el codigo este bien o mal, pero me da este error: No se puede encontrar el punto de entrada de la DLL uchange en C:\dll.dll

revenge1252

#8
Hola.. por ahora veo que nadie me ayuda, en fin u.u..


e avanzado un poco mas en solitario, descarto la teoria extraña de que igual no le dio tiempo a cargar a IE y por eso no funcione, el error esta en que UrlMkSetSessionOption no carga correctamente, el codigo no funciona.

ya que me deje de timers etc en la dll y directamente inyecte la dll en un proceso de Internet explorer que ya habia cargado por completo, aparecio el msgbox, y justo detras de el iva el supuesto cambio de UA, pero no lo cambio... estoy casi seguro de que es tema de declaraciones mal hechas, pero ahi si que por ahora sigo sin conseguir nada...

aver si alguien me ayuda TT saludos