Как получить доступ к функциям из libsndfile-1.dll в MSVC? - PullRequest
0 голосов
/ 06 октября 2009

У меня проблемы с тем, чтобы libsndfile-1.dll работал в моем проекте MSVC. Я могу загрузить библиотеку и получить строку версии из библиотеки DLL, вызвав sf_command() из моего кода. Однако я не могу заставить sf__open() вернуть указатель SNDFILE.

Я также заметил, что не могу заставить fopen() вернуть указатель FILE (возможно, это связано, я думаю, sf_open() использует fopen() !?).

Я довольно новичок в MSVC, C / C ++ и Windows в целом, поэтому, возможно, мне не хватает чего-то действительно очевидного.

Мой main.cpp выглядит так:

#include <windows.h>
#include <stdio.h>

#include "sndfile.hh"

// create some function pointers to point to the dll function addresses
// I'm winging this a bit. hopefully it's right!? seems to work!
typedef int (*SF_COMMAND)(SNDFILE*, int, void*, int); 
typedef SNDFILE* (*SF_OPEN)(const char*, int, SF_INFO*); 

int main()
{
    // dll handle
    HINSTANCE hDLL = NULL;

    // create some vars to store the dll funcs in
    SF_COMMAND     sf_command;
    SF_OPEN        sf_open;

    // load the dll
    hDLL = LoadLibrary(L"libsndfile-1.dll");

    // check the dll loaded
    if( NULL == hDLL )
    {
        printf("Error, Could not load library \n");
        return 1;
    }

    // get the dll funcs
    sf_command = (SF_COMMAND)GetProcAddress(hDLL, "sf_command");
    sf_open = (SF_OPEN)GetProcAddress(hDLL, "sf_open");

    // check we got the funcs
    if(!(sf_command && sf_open)){
        printf("Error exporting dll functions \n");
        return 2;
    }

    // all good so far!
    // try the first function
    char* version_string[sizeof(char*)*4];
    int res = sf_command(NULL, SFC_GET_LIB_VERSION, &version_string, sizeof(version_string));

    if(res){
        // all good!
        printf("Version: %s \n", version_string);
    }

    // now try and create a SNDFILE pointer
    SF_INFO info;
    SNDFILE* sfp = sf_open("c:\\Godspeed.aif", SFM_READ, &info);

    if(sfp){
        printf("Hurray! successfully opened the SNDFILE!! \n");
    }else{
        printf("Doh! couldn't open the SNDFILE!! \n");
        // Grr!!
        return 3;
    }

    return 0;
}

Проект компилируется и завершается с кодом 3 (не удалось открыть файл! (Я почти уверен, что файл там есть!)).

Когда я запускаю exe, вывод:
Version: libsndfile-1.0.17
Doh! couldn't open the SNDFILE

У кого-нибудь есть предложения относительно того, где я иду не так?

Большое спасибо,
Джош.

1 Ответ

0 голосов
/ 06 октября 2009

Хм, я действительно должен научиться не публиковать сообщения на форумах поздно вечером! Сегодня утром у меня была еще одна попытка, и файл был открыт через несколько минут. Я неправильно получал свои пути (не привык к этим странным путям Windows)! Я пытался использовать относительный путь и бинго! Надеюсь, это кому-нибудь поможет!

...