Páginas: [1]
|
 |
|
Autor
|
Tema: Api's en C (Leído 351 veces)
|
Krackwar
Desconectado
Mensajes: 851
Odio al hombre que rie xD
|
Hola , e estado aprendiendo C(empese hoy) y ya se ocupar las librerias que contienen las api's declaradas , pero quiero saber declarar las api's ya que encuentro que por ejemplo windows.h agrande mucho el .exe.
|
|
|
|
|
En línea
|
[ìmg]http://img523.imageshack.us/img523/4146/dibujozx1.png [/img]
|
|
|
Freeze.
Desconectado
Mensajes: 2.455
FireSoft
|
Pues tienes que usar LoadLibrary con el nombre de la DLL ejemplo LoadLibrary("user32") lo que te retorne lo usas en el primer parametro de GetProcAddress y el 2do parametro lo rellenas con el nombre de la api ejemplo GetProcAddress (retvarLoadLibrary,"OpenProcess"). Creo que es de esta manera  Sino aca te pongo un ejemplo de la Api-guide que acabo de conseguir: Create a new project and add this code to Form1 Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long Private Sub Form_Load() On Error Resume Next 'KPD-Team 1999 'URL: http://www.allapi.net/ 'E-Mail: KPDTeam@Allapi.net 'We're going to call an API-function, without declaring it! Dim lb As Long, pa As Long 'map 'user32' into the address space of the calling process. lb = LoadLibrary("user32") 'retrieve the address of 'SetWindowTextA' pa = GetProcAddress(lb, "SetWindowTextA") 'Call the SetWindowTextA-function CallWindowProc pa, Me.hWnd, "Hello !", ByVal 0&, ByVal 0& 'unmap the library's address FreeLibrary lb End Sub Esta en VB pero es fácil de traducir. Edito: De todas maneras no veo como puedes decir que al incluir windows.h te aumenta el peso de tu ejecutable 
|
|
|
|
« Última modificación: 24 Junio 2008, 05:03 por Freeze. »
|
En línea
|
Un nuevo CMS, pruebalo:

|
|
|
Krackwar
Desconectado
Mensajes: 851
Odio al hombre que rie xD
|
Pues tienes que usar LoadLibrary con el nombre de la DLL ejemplo LoadLibrary("user32") lo que te retorne lo usas en el primer parametro de GetProcAddress y el 2do parametro lo rellenas con el nombre de la api ejemplo GetProcAddress (retvarLoadLibrary,"OpenProcess"). Creo que es de esta manera  Sino aca te pongo un ejemplo de la Api-guide que acabo de conseguir: Create a new project and add this code to Form1 Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long Private Sub Form_Load() On Error Resume Next 'KPD-Team 1999 'URL: http://www.allapi.net/ 'E-Mail: KPDTeam@Allapi.net 'We're going to call an API-function, without declaring it! Dim lb As Long, pa As Long 'map 'user32' into the address space of the calling process. lb = LoadLibrary("user32") 'retrieve the address of 'SetWindowTextA' pa = GetProcAddress(lb, "SetWindowTextA") 'Call the SetWindowTextA-function CallWindowProc pa, Me.hWnd, "Hello !", ByVal 0&, ByVal 0& 'unmap the library's address FreeLibrary lb End Sub Esta en VB pero es fácil de traducir. Edito: De todas maneras no veo como puedes decir que al incluir windows.h te aumenta el peso de tu ejecutable  Y como obtengo loadlibrary si no la tengo declarada  697 KB encuentro que es mucho para este code: ] #include <windows.h> int main() { HWND resp; //-->variables para cambiar el texto del boton char*Dad="Shell_TrayWnd"; char*Child="Button"; char*texto="rata";//<---------Texto a poner maximo 5 caracteres resp=FindWindow(Dad,0); resp=FindWindowEx(resp,0,Child,0); SetWindowText(resp,texto); } Lo acabo de hacer yo  .
|
|
|
|
|
En línea
|
[ìmg]http://img523.imageshack.us/img523/4146/dibujozx1.png [/img]
|
|
|
|
|
Krackwar
Desconectado
Mensajes: 851
Odio al hombre que rie xD
|
A mi me aparecen 16 Kbs  Igual es mucho y a mi por que me pesa tanto?
|
|
|
|
|
En línea
|
[ìmg]http://img523.imageshack.us/img523/4146/dibujozx1.png [/img]
|
|
|
|
|
E0N
Lab &
Colaborador
Conectado
Mensajes: 2.682
|
No es cuestión de librerías, es cuestión de como te configures el linker, mira este código que me pasó Robokop hace tiempo: #pragma optimize("gsy",on) #pragma comment(linker,"/RELEASE") #pragma comment(linker,"/ENTRY:PuntoN") #pragma comment(linker,"/MERGE:.rdata=.data") #pragma comment(linker,"/MERGE:.text=.data") #pragma comment(linker,"/MERGE:.reloc=.data") #pragma comment(linker,"/SECTION:.text,EWR /IGNORE:4078") #pragma comment(linker,"/FILEALIGN:0x200") #pragma comment(linker,"/subsystem:windows")
#include <windows.h>
void PuntoN() { MessageBox(0,"Programa de 1 kb","Lol",0); } Pesa 1KB, que es un peso razonable. O también puedes hacer estó, que lo posteó Eternal Idol: Poner el cpp en C:\Archivos de programa\Microsoft Visual Studio\VC98\Bin y escribir en la consola: (haces cd para irte hasta esa ruta  ) cl /c /O1 iny.cpp
link iny.obj /NODEFAULTLIB kernel32.lib /entry:main /align:4 Todo eso se lo puedes poner al linker del VC++ en la configuración de tu proyecto para no tener que andar tirando de consola, y no te olvides de compilar en release, no en debug, que eso solo ya resta bastante peso (y de googlear  ) Salu2
|
|
|
|
|
En línea
|
|
|
|
|
Karman
|
este es una versión parecida pero compilada con el DevCpp (mingw) y pesa 2 kb... #include <windows.h> int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil){ MessageBox(0,"Programa de 2 kb","Lol",0); return 0; } para hacerlo tenés que ir a proyecto->opciones->compilador->linker y activar las últimas 2 opciones (no usar librerías standares y tira ejecutable), y luego incluir manualmente la librería "libuser32.a" en argumentos del compilador... quizás pueda hacerse que pese menos todavía, pero requeriría generar el makefile a mano... S2
|
|
|
|
|
En línea
|
|
|
|
Krackwar
Desconectado
Mensajes: 851
Odio al hombre que rie xD
|
este es una versión parecida pero compilada con el DevCpp (mingw) y pesa 2 kb... #include <windows.h> int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil){ MessageBox(0,"Programa de 2 kb","Lol",0); return 0; } para hacerlo tenés que ir a proyecto->opciones->compilador->linker y activar las últimas 2 opciones (no usar librerías standares y tira ejecutable), y luego incluir manualmente la librería "libuser32.a" en argumentos del compilador... quizás pueda hacerse que pese menos todavía, pero requeriría generar el makefile a mano... S2 Tu ejemplo me da 17,2 KB de peso , pero no hay en C algo como el : data import library kernel32,'KERNEL32.DLL'
import kernel32,\ alias,'nombre de la api' end data
??? solo quiero saber declarar api's manualmente nada de otro mundo el peso del ejecutable no me importa tanto es mas que quiero saber eso de declarar api's , ya que la verdad estoy aprendiendo C para pasar un code que tengo en C a otro lenguaje  . PD: Antes de venir a joder busque en google y siempre asian referencias a .h . Edit: No te acostumbres a los pocos bytes del ASM  Yo estoy compilando con el Dev C++ no se tú.  A mi una aplicación vacia me pesa 15 KB  15 kb es mucho peso para una aplicaci'on vacia , por lo que yo tengo entendido en C se podian hacer aplicaciones de menos de 1kb
|
|
|
|
« Última modificación: 24 Junio 2008, 18:48 por Krackwar »
|
En línea
|
[ìmg]http://img523.imageshack.us/img523/4146/dibujozx1.png [/img]
|
|
|
|
Karman
|
Tu ejemplo me da 17,2 KB de peso...
No se que parámetro te debe faltar pero a mi con mingw 3.4 me da 2 kb... no habrás desactivado el uso de las librerías standares o estará en modo debug(??) gcc.exe -c main.c -o main.o -I"D:/DevCpp/include" -nostdlib gcc.exe main.o -o "genericoN.exe" -L"D:/DevCpp/lib" -mwindows ../lib/libuser32.a -nostdlib -s total de errores: 0 tamaño salida: 2048 Bytes (2 KB)
es más, supongo que se podría hacer que pese 1 kb si se le dijera que utilice una única sección: #pragma comment(linker,"/MERGE:.rdata=.data") #pragma comment(linker,"/MERGE:.text=.data") #pragma comment(linker,"/MERGE:.reloc=.data")
pero esta parte desconozco como se hace con este compilador... y no tengo ganas de investigar... je Lo único que no entiendo es que drama tienen con las cabeceras??? que un h defina 300 funciones no quiere decir que se vayan a compilar con el programa... las H lo único que hacen es definir el formato de las funciones / tipos, lo que define el peso del programa son las instrucciones que se ejecutan, los programas que dicen que no pesan menos de 17 kb es porque el compilador (por defecto) incluye una serie de funciones (comprueba versión de windows, administra argumentos enviados, etc), por eso, deshabilitando esa parte (como lo puse) ya se obtiene un ejecutable puro... Además... tampoco para exagerar... no podes hacer aplicaciones de menos de 1 kb... S2
|
|
|
|
« Última modificación: 24 Junio 2008, 20:57 por Karman »
|
En línea
|
|
|
|
|
Páginas: [1]
|
|
|
|