NewFork
Зарегистрирован: 28.02.2005 Сообщения: 73
|
Добавлено: Вт Май 16 2006 08:08 Заголовок сообщения: Re: WinApi на C++ |
|
|
--Erick-- писал(а): | люди .. покажите, плиз, пример WinApi на C++ |
Каков вопрос, таков ответ. Вот тебе маленький кусочек из программы, с использованием АПИ
Код: | HRESULT
GetFileName(BSTR FAR* pbstrFileName)
{
OLECHAR buf[1024];
BSTR bstrFileName;
#ifdef _MAC
int i;
Point pt;
long dirID;
char *p, *q;
SFReply sfr;
SFTypeList sftl;
short sRefNumReal;
SetPt(&pt, 100, 100);
//sftl[0] = 'OTLB';
sftl[0] = 0; // currently allow all file types
SFGetFile(pt, NULL, NULL, -1, sftl, NULL, &sfr);
if(!sfr.good)
return ResultFromScode(E_FAIL);
// translate sfr.vRefNum into a dirID
{
WDPBRec wdpbr;
wdpbr.ioWDIndex = 0;
wdpbr.ioVRefNum = sfr.vRefNum;
wdpbr.ioWDVRefNum = 0;
wdpbr.ioWDIndex = 0;
wdpbr.ioWDProcID = 0;
wdpbr.ioNamePtr = (StringPtr)buf;
if(PBGetWDInfoSync (&wdpbr) != noErr)
return ResultFromScode(E_FAIL);
sRefNumReal = wdpbr.ioWDVRefNum;
dirID = wdpbr.ioWDDirID;
}
{
Str255 stDir;
CInfoPBRec pb;
DirInfo *pdirinfo = (DirInfo*)&pb;
char rgchTemp[256]; // REVIEW: what should the size be?
pdirinfo->ioNamePtr = stDir;
pdirinfo->ioVRefNum = sRefNumReal;
pdirinfo->ioDrParID = dirID;
pdirinfo->ioFDirIndex = -1; // get info on a dir
buf[0] = '\0';
// loop until we hit the root dir
do{
pdirinfo->ioDrDirID = pdirinfo->ioDrParID;
if(PBGetCatInfoSync (&pb) != noErr)
return ResultFromScode(E_FAIL);
strncpy(rgchTemp, (char*)stDir, 64);
p2cstr((StringPtr)rgchTemp);
strcat(rgchTemp, ":");
strcat(rgchTemp, buf);
strcpy(buf, rgchTemp);
}while(pdirinfo->ioDrDirID != fsRtDirID);
}
q = (char*)sfr.fName;
i = (int)*q++;
p = &buf[strlen(buf)];
while(i-->0)
*p++ = *q++;
*p = '\0';
if((bstrFileName = SysAllocString(buf)) == NULL)
return ResultFromScode(E_OUTOFMEMORY);
#else
OPENFILENAME ofn;
memset(&ofn, 0, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = g_hwnd;
ofn.lpstrFile = (LPTSTR) &buf;
ofn.nMaxFile = sizeof(buf);
*buf = OLESTR('\0');
ofn.lpstrFilter = TSTR("Type Libraries\0*.tlb\0\0");
ofn.nFilterIndex = 1;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_SHAREAWARE;
if(GetOpenFileName(&ofn) == 0){
// REVIEW: we can probably do something smarter with this error
DWORD dwerr = CommDlgExtendedError();
return ResultFromScode(E_FAIL);
}
#if defined(WIN32) && !defined(UNICODE)
OLECHAR szFileW[_MAX_PATH];
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
ofn.lpstrFile, -1, szFileW, _MAX_PATH);
if((bstrFileName = SysAllocString(szFileW)) == NULL)
return ResultFromScode(E_OUTOFMEMORY);
#else
if((bstrFileName = SysAllocString(ofn.lpstrFile)) == NULL)
return ResultFromScode(E_OUTOFMEMORY);
#endif
#endif
*pbstrFileName = bstrFileName;
return NOERROR;
}
|
|
|