Переделайте этот метод так
X++:
#define.fileNamelength(1024*4)
str getOpenFileName(int _hwnd,
FilenameFilter _conFilter,
str _strInitialPath,
str _dialogTitle,
str _strDefaultExtension='',
str _strDefaultFileName='',
int _flags = #OFN_FILEMUSTEXIST)
{
Binary oFN, bFileName, bStrFilter, bStrInitialPath, bDialogTitle, bstrDefaultExtension;
str tmpstr;
str sFileName;
str dirName, file;
int strOffset, i;
Info info;
DLL _DLL = new DLL('COMDLG32');
DLLFunction _getOpenFileName = new DLLFunction(_DLL, 'GetOpenFileNameA');
_getOpenFileName.returns(ExtTypes::DWord);
_getOpenFileName.arg(ExtTypes::Pointer);
strOffset = 0;
strOffset = 0;
for (i=1; i<=conLen(_conFilter); i++)
{
tmpstr = conPeek(_conFilter, i);
if (i mod 2)
tmpstr += ' ('+conPeek(_conFilter, i+1)+')';
strOffset += 1 + strLen(tmpstr);
}
info = new Info();
bFileName = new Binary(#fileNamelength);
oFN = new Binary(#structSize);
bStrFilter = new Binary(strOffset + 2);
bstrDefaultExtension = new Binary(#fileNamelength);
bStrInitialPath = new Binary(_strInitialPath);
bDialogTitle = new Binary(_dialogTitle);
bFileName.string(#Offset0, _strDefaultFileName);
strOffset = 0;
for (i=1; i<=conLen(_conFilter); i++)
{
tmpstr = conPeek(_conFilter, i);
if (i mod 2)
tmpstr += ' ('+conPeek(_conFilter, i+1)+')';
bStrFilter.string(strOffset, tmpstr);
strOffset += 1 + strLen(tmpstr);
}
oFN.dWord( #Offset0 , #structSize);
oFN.dWord( #offset4 , _hwnd);
oFN.dWord( #offset8 , info.instance());
oFN.binary(#offset12 , bStrFilter);
oFN.dWord( #offset16 , 0);
oFN.dWord( #offset20 , 0);
oFN.dWord( #offset24 , 1);
oFN.binary(#offset28 , bFileName);
oFN.dWord( #offset32 , #fileNamelength);
oFN.dWord( #offset36 , 0);
oFN.dWord( #offset40 , 0);
oFN.binary(#offset44 , bStrInitialPath);
oFN.binary(#offset48 , bDialogTitle);
oFN.dWord( #offset52 , #OFN_HIDEREADONLY |
#OFN_PATHMUSTEXIST |
#OFN_SHAREAWARE |
#OFN_NOCHANGEDIR |
_flags |
#OFN_EXPLORER);
oFN.word( #offset56 , 0);
oFN.word( #offset58 , 0);
oFN.binary(#offset60 , bstrDefaultExtension);
oFN.dWord( #offset64 , 0);
oFN.dWord( #offset68 , 0);
oFN.dWord( #offset72 , 0);
if(_getOpenFileName.call(oFN))
{
if (_flags & #OFN_ALLOWMULTISELECT)
{
dirName = bFileName.string(#Offset0);
i = strlen(dirName) + 1;
sFileName = "";
while (bFileName.byte(i))
{
file = bFileName.string(i);
i += strlen(file) + 1;
sFileName += dirName + "\\" + file + (bFileName.byte(i) ? ";" : "" );
}
}
else
sFileName = bFileName.string(#Offset0);
}
else
sFileName = '';
i = strLen(sfilename);
return sFileName;
}
В случае множественного выбора будет возвращаться строка с выбранными файлами, разделенная точкой с запятой (; )
В макрос #fileNamelength установите размер побольше, чтобы гарантированно влезли все выбранные вами файлы (можно устанавливать размер точно, но придется повторно вызывать окно выбора)