Clipboard modificado: Soporte para copia/corte de archivos
Publicado: 10 Abr 2011 18:03
Bueno he tenido un momento y ceone me ha preguntado mucho sobre como copiar archivos mediante el portapapeles, como no lo veo por ahi subo aqui el plugin modificado por si a alguien mas le interesa.
Como bug conocido, creo que puede dar ploblemas al usar strings mas largos que 250 caracteres, por lo que os pido que hagais pruebas para arreglarlo si es asi.
La funcion no viene en el fichero de ayuda ni en el xml
Clipboard.CopyFile(string ARCHIVOS, bool CORTECOPIA);
ARCHIVOS: Ruta completa tipica al archivo en cuestion, usando los \\ y toda esa mierda, si quereis copiar mas de un archivo usad el separador "|"
CORTECOPIA: true para copiar, false para cortar
ejemplo: Clipboard.CopyFile("c:\\MyFile.txt|c:\\test2.xls",false);
Codigo fuente (lo he comentado un poquito):
A descargar:
salu2
Como bug conocido, creo que puede dar ploblemas al usar strings mas largos que 250 caracteres, por lo que os pido que hagais pruebas para arreglarlo si es asi.
La funcion no viene en el fichero de ayuda ni en el xml
Clipboard.CopyFile(string ARCHIVOS, bool CORTECOPIA);
ARCHIVOS: Ruta completa tipica al archivo en cuestion, usando los \\ y toda esa mierda, si quereis copiar mas de un archivo usad el separador "|"
CORTECOPIA: true para copiar, false para cortar
ejemplo: Clipboard.CopyFile("c:\\MyFile.txt|c:\\test2.xls",false);
Codigo fuente (lo he comentado un poquito):
static int irclipboard_copyfile (lua_State *L)
{
int nLastError = 0;
IRLUA_PLUGIN_ResetLastError(L);
IRLUA_PLUGIN_CheckNumArgs(L,1);
CString path;
BOOL bCopy;
path = IRLUA_PLUGIN_CheckString(L,1); //obtenemos el string
bCopy = IRLUA_PLUGIN_CheckBoolean(L,2); //obtenemos el booleano de copia o corte
//path.Replace("|", ""
//--------------------------------------------CString path, BOOL nCopy
char tmp[256]; //TODO@: 256 caracteres no es muy poco?
ZeroMemory(tmp,256);
for(int i = 0;i<path.GetLength();i++) //Inyectamos uno a uno cada caracter de nuestro string en una cadena de memoria char, guardada en memoria volatil
{
if (path.GetAt(i)!=0x7c) tmp = path.GetAt(i); //como con lua no hay forma de insertar un simbolo 0x00 obtenemos un caracter digamos raro | (0x7c) si lo encuentra en esta posicion de memoria no escribimos nada, lo cual dejara la cadena como 0x00
}
//--------------------------------------------char *lpBuffer, UINT uBufLen, BOOL bCopy
//todo esto inicia variables que vamos a usar
char *lpBuffer;
UINT uBufLen;
UINT uDropEffect;
DROPFILES dropFiles;
UINT uGblLen,uDropFilesLen;
HGLOBAL hGblFiles,hGblEffect;
char *szData,*szFileList;
DWORD *dwDropEffect;
//CutOrCopyFiles(tmp,path.GetLength(),nCopy);
lpBuffer=tmp;
uBufLen=path.GetLength();
//bCopy = true;
//configuramos el drop effect, osea, copia o corte
uDropEffect=RegisterClipboardFormat("Preferred DropEffect");
hGblEffect=GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE,sizeof(DWORD));
dwDropEffect=(DWORD*)GlobalLock(hGblEffect);
if(bCopy)
*dwDropEffect=DROPEFFECT_COPY;
else
*dwDropEffect=DROPEFFECT_MOVE;
GlobalUnlock(hGblEffect);
uDropFilesLen=sizeof(DROPFILES);
dropFiles.pFiles =uDropFilesLen;
dropFiles.pt.x=0;
dropFiles.pt.y=0;
dropFiles.fNC =FALSE;
dropFiles.fWide =TRUE;
//escribimos la memoria con mierda aleatoria que funciona gracias a los hijos de puta de ms
uGblLen=uDropFilesLen+uBufLen*2+8;
hGblFiles= GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, uGblLen);
szData=(char*)GlobalLock(hGblFiles);
memcpy(szData,(LPVOID)(&dropFiles),uDropFilesLen);
szFileList=szData+uDropFilesLen;
//hora de convertir nuestra mierda de bytes a una cadena wide, despues de 2 conversiones ya... otra maravilla gracias a los colegas de ms
MultiByteToWideChar(CP_ACP,MB_COMPOSITE,
lpBuffer,uBufLen,(WCHAR *)szFileList,uBufLen);
GlobalUnlock(hGblFiles);
//esto no necesita explicacion¿?
if( OpenClipboard(NULL) )
{
EmptyClipboard(); //jodemos todo lo que haya
SetClipboardData( CF_HDROP, hGblFiles ); //usamos CF_HDROP que nos va a permitir copiar y pegar mierdas
SetClipboardData(uDropEffect,hGblEffect); //agregamos el drop effect
CloseClipboard(); //mandamos a tomar por culo la memoria usada
}
return 0;
}
A descargar:
salu2