Похоже, проблема в том, что вы передаете имя переменной buffer
в функцию mciSendString
в виде строки вместо передачи содержимого буфера.
Вам необходимо объединить аргументы, которые вы хотите передать (open
и alias myFile
), с содержанием из buffer
.
Код также можно значительно упростить, заменив malloc
на автоматический массив. Вам не нужно malloc
это, потому что вам это не нужно вне области видимости блока. (И вам все равно не следует использовать malloc
в коде C ++; вместо этого используйте new[]
.)
Вот модифицированный фрагмент кода, показанного в вашем вопросе:
(Предупреждение: изменения сделаны только с использованием моих глаз в качестве компилятора! Обращаться с осторожностью.)
if(GetOpenFileName(&ofn))
{
// Get the short path name, and place it in the buffer array.
// We know that a short path won't be any longer than MAX_PATH, so we can
// simply allocate a statically-sized array without futzing with new[].
//
// Note: In production code, you should probably check the return value
// of the GetShortPathName function to make sure it succeeded.
TCHAR buffer[MAX_PATH];
GetShortPathName(szFileName, buffer, MAX_PATH);
// Add the short path name to your ListBox control.
//
// Note: In C++ code, you should probably use C++-style casts like
// reinterpret_cast, rather than C-style casts!
SendMessage(hList, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(buffer));
// Build the argument string to pass to the mciSendString function.
//
// Note: In production code, you probably want to use the more secure
// alternatives to the string concatenation functions.
// See the documentation for more details.
// And, as before, you should probably check return values for error codes.
TCHAR arguments[MAX_PATH * 2]; // this will definitely be large enough
lstrcat(arguments, TEXT("open"));
lstrcat(arguments, buffer);
lstrcat(arguments, TEXT("alias myFile"));
// Or, better yet, use a string formatting function, like StringCbPrintf:
// StringCbPrintf(arguments, MAX_PATH * 2, TEXT("open %s alias myFile"),
// buffer);
// Call the mciSendString function with the argument string we just built.
mciSendString(arguments, NULL, 0, NULL);
mciSendString("play myFile", NULL, 0, NULL);
}
Обратите внимание, что, как показывает приведенный выше код, работа со строками в стиле C (массивами символов) - это настоящая боль в заднице. C ++ предоставляет лучшую альтернативу в виде класса std::string
. Вы должны настоятельно рассмотреть использование этого вместо этого. Для вызова функций Windows API вам все равно понадобится строка в стиле C, но вы можете получить одну из них, используя метод c_str
класса std::string
.