Вышеупомянутые ответы хороши, но в моем случае 1-й подход, который преобразует функцию в статическую, не работает. Я пытался преобразовать код выхода, чтобы перейти в функцию потока, но этот код имел множество ссылок на нестатические члены класса. Второе решение инкапсулирования в объект C ++ работает, но имеет 3-уровневые оболочки для запуска потока.
У меня было альтернативное решение, которое использует существующую конструкцию C ++ - функцию «friend», и она отлично работала для моего дело. Пример того, как я использовал «друга» (будет использовать тот же пример для имен, показывающий, как его можно преобразовать в компактную форму с помощью друга)
class MyThreadClass
{
public:
MyThreadClass() {/* empty */}
virtual ~MyThreadClass() {/* empty */}
bool Init()
{
return (pthread_create(&_thread, NULL, &ThreadEntryFunc, this) == 0);
}
/** Will not return until the internal thread has exited. */
void WaitForThreadToExit()
{
(void) pthread_join(_thread, NULL);
}
private:
//our friend function that runs the thread task
friend void* ThreadEntryFunc(void *);
pthread_t _thread;
};
//friend is defined outside of class and without any qualifiers
void* ThreadEntryFunc(void *obj_param) {
MyThreadClass *thr = ((MyThreadClass *)obj_param);
//access all the members using thr->
return NULL;
}
Конечно, мы можем использовать boost :: thread и избегайте всего этого, но я пытался изменить код C ++, чтобы не использовать boost (код был связан с boost именно для этой цели)
Кажется, что stdole.dll основной interop блок . См. Office 2003 Primary Interop Assemblies на MSDN.
Мне также пришлось добавить ссылку на мой проект для stdole. Несмотря на то, что у меня нет никаких ссылок на него (это простое приложение для изображений), у двух наших пользователей возникали ошибки, которые отсутствовали. Возможно, они использовали только .net 2.0, когда это приложение 3.5. Я понял почему.
Я также зашел, чтобы опубликовать на вкладке свойств проекта, и выбрал Application Files, а затем включил stdole для развертывания. Надеюсь, это сработает.
У меня была такая же проблема. Я просто удалил ссылку из приложения и перекомпилировал. Прогнал все тесты, которые прошли. Потом заново развернул без dll и все заработало.
Я не знаю, как ссылка на это вообще попала в проект. Это устаревшее приложение, должно быть, было давным-давно.
Саймон