_Q12_ Ответов: 1

Winapp с wmplayer в нем который использует свою собственную DLL


У меня есть winapp с wmPlayer в нем, который использует свои собственные dll-файлы, чтобы на самом деле функционировать.
Но, когда я перемещаю свое приложение в другую папку, которая не содержит 2 dll, связанных с плеером в нем, мое приложение замораживается на 1 минуту и автоматически закрывается по умолчанию.
Я хочу, чтобы способ выскочить MessageBox с моей пользовательской ошибкой, чтобы напомнить себе (пользователю) об этом маленьком шаге; чтобы добавить dll-файлы с приложением внутри той же папки.

отредактировано#1
Мой скомпилированный exe-файл имеет эту проблему. Не проект против.
Когда я помещаю его с 2 dll-файлами в одну папку, то все в порядке, независимо от расположения папки на моем жестком диске. Проблема возникает, когда я забываю переместить dll-файлы в папку приложения.
Мой код работает нормально. Проблема заключается в том, что объект "player" запрашивает эти dll-файлы при инициализации формы. Я не думаю, что он даже проходит после InitializeComponent();

Проверьте, что я пробовал:
Я пробовал с 2 нитями.
Я пробовал с {try catch}.
Нет (хороших) результатов.

Спасибо.


public Form1()
{
    InitializeComponent();
    di = new DirectoryInfo(path);

    Thread thread1 = new Thread(new ThreadStart(A));
    Thread thread2 = new Thread(new ThreadStart(B));
    thread1.Start();
    thread2.Start();
    thread1.Join();
    thread2.Join();
}

void A()
{
    bool Interop = false;
    bool AxInterop = false;
    foreach (var file in di.GetFiles())
    {
        //Interop.WMPLib.dll
        //AxInterop.WMPLib.dll
        if (file.Name == "Interop.WMPLib.dll")
        {
            Interop = true;
        }
        if (file.Name == "AxInterop.WMPLib.dll")
        {
            AxInterop = true;
        }
    }
    if (Interop & AxInterop) { }
    else
    {
        MessageBox.Show("Error: Interop.WMPLib.dll or AxInterop.WMPLib.dll is missing to run this player.\r\n Please put the 2 dll with this application in the same folder.");
    }
}


Что я уже пробовал:

Я пробовал с 2 нитями.
Я пробовал с {try catch}.
Нет (хороших) результатов.

Richard MacCutchan

Почему вы используете потоки и GetFiles? Вы можете просто попробовать загрузить фактические библиотеки DLL, чтобы увидеть, присутствуют ли они.

_Q12_

Простите, если я недостаточно ясно выразился.
Мой скомпилированный exe-файл имеет эту проблему. Не проект против.
Вообще-то я прямо сейчас изменю свой первоначальный вопрос.
И если вы имеете в виду скомпилированный exe-файл, как я изначально предполагал, то да, когда я помещаю его с 2 dll-файлами в одну папку, то все в порядке, независимо от расположения папки на моем жестком диске.

Richard MacCutchan

Ну, вот как это должно работать. При попытке доступа к библиотеке DLL Windows будет искать ее в папках системной библиотеки, папках, указанных в переменной PATH, и, наконец, в папке, содержащей исполняемый файл. Если DLL не будет найдена, то программа завершится неудачей.

Richard MacCutchan

Каково значение параметра "путь", которое вы используете для получения информации о каталоге? Также прекратите использовать потоки для этого, они не служат никакой цели.

_Q12_

строковый путь = приложение.StartupPath;
и тогда я использую его: DirectoryInfo di = new DirectoryInfo(path);
Мой код работает нормально. Проблема заключается в том, что объект "VideoPlayer" запрашивает эти dll-файлы при инициализации формы. Я не думаю, что он даже проходит после InitializeComponent();
Как вы уже сказали, "Windows будет искать его(dll) в папках системной библиотеки" (которые находятся...где?)(вероятно, мне следует переместить эти dll-файлы туда, чтобы никогда не возникало этой проблемы в будущем?) Я хотел бы переместить их в пользовательскую папку, например основную, из которой каждая копия моего приложения будет "знать", где искать.
Еще одна особенность моего приложения заключается в том, что я копирую его там, где мне нужно, - в основном в папках фильмов,чтобы составить там список фильмов, циклировать их, сортировать, просматривать и т. д.

Richard MacCutchan

Вы должны установить приложение и dll-файлы в одну папку. Использовать либо программные файлы, программные файлы (x86) или папка AppData\местные\программы. Таким образом, вы знаете, что вся система готова к использованию.

0x01AA

Угадайте, почему ваш код не работает: сравнение строк, как и вы, чувствительно к регистру. Во всяком случае, я опубликовал решение, которое, как я надеюсь, более простое и, надеюсь, работает ;)

1 Ответов

Рейтинг:
1

0x01AA

Этот более простой код должен сделать свою работу:

// exePath is defined by you...

//...  or determined  this waay
string exePath =System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);

// Do the dll's exists in exe path
bool Interop =  File.Exists(Path.Combine(exePath, "Interop.WMPLib.dll"));
bool AxInterop=  File.Exists(Path.Combine(exePath, "AxInterop.WMPLib.dll"));


_Q12_

я отредактировал свой первоначальный вопрос и добавил следующее:
Мой скомпилированный exe-файл имеет эту проблему. Не проект против.
Когда я помещаю его с 2 dll-файлами в одну папку, то все в порядке, независимо от расположения папки на моем жестком диске. Проблема возникает, когда я забываю переместить dll-файлы в папку приложения.
Мой код работает нормально. Проблема заключается в том, что объект player запрашивает эти dll-файлы при инициализации формы. Я не думаю, что он даже проходит после InitializeComponent();