У меня есть решение, и в нем есть два проекта. Когда я получил код, он сказал, что один проект обрабатывает визуальную часть, а другой - логическую часть. Теперь я добавил одну кнопку в окно. Для этого я редактировал проект, который обрабатывает визуальную часть. Я очень новичок в этом, но создание и добавление кнопок довольно просто в visual studio 2010. Теперь проблема в том, что я хочу определить, нажата ли кнопка из другого проекта. Я уверен, что проекты делятся некоторыми данными, но я не могу их захватить. На данный момент я меняю значение в файле и читаю те же данные из другого проекта, чтобы проверить, нажата ли кнопка. Но я думаю, что есть лучший способ сделать это. Может ли кто-нибудь помочь?Доступ к переменной из одного проекта в другой в visual studio C++
ответ
Я не думаю, что оба проекта делятся автоматически. Вам нужно будет определить интерфейс, который связывает два проекта. Например, в вашем решении выше «значение в файле» - это «интерфейс», который вы определили. Похоже, что вы пытаетесь добиться того, чтобы разделить контроллер (логическую часть) и представление (визуальную часть) отдельно, что, по-видимому, указывает на то, что ваш проект использует модель MVC.
Я бы предложил определить абстрактный класс (интерфейс), который определяет взаимодействие между двумя проектами. Все, что им нужно предоставить, - это один заголовочный файл.
Например:
// Solution A (Controller - logic part)
// MyUIHandler.h
class IMyUIHandler //You can also use microsoft's interface keyword for something similar.
{
public:
HRESULT onButtonPressed() = 0; // Note that you can also add parameters to onButtonPressed.
};
HRESULT getMyUIHandler(IMyUIHandler **ppHandler);
Затем реализовать этот интерфейс:
// Solustion A (Controller - logic part)
// MyUIHandler.cpp
#include "MyUIHandler.h"
class CMyUIHandler : public IMyUIHandler
{
private:
// Add your private parameter here for anything you need
public:
HRESULT onButtonPressed();
}
HRESULT getMyUIHandler(IMyUIHandler **ppHandler)
{
// There are many ways to handle it here:
// 1. Define a singleton object CMyUIHandler in your project A. Just return a pointer
// to that object here. This way the client never releases the memory for this
// object.
// 2. Create an instance of this object and have the client release it. The client
// would be responsible for releasing the memory when it's done with the object.
// 3. Create an instance of this object and have a class/method in Solution A release
// the memory.
// 4. Reference count the object, for example, make IUnknown the parent class of
// IMyUIHandler, and implement the IUnknown interace (which is boiler plate code).
// Since I don't know your project it's hard for me to pick the most suitable one.
...
*ppHandler = myNewHandler;
...
return S_OK;
}
CMyUIHandler может быть просто существующий класс, который уже обрабатывает некоторые из логики.
В решении B вы должны вызвать getMyUIHandler в некоторой функции инициализации, например контроллер класса UI, за исключением этого в качестве вашего члена. Затем «Button clicked» обработчик событий, который создает VS для вас.
// Solution B (View - visual part)
// MyUIView.h
class MyUIView
{
protected:
IMyUIHandler *m_pHandler;
}
// MyUIView.cpp
CMyUIView::CMyUIView(...)
{
...
hr = getMyUIHandler(&m_pHandler);
// error handler, etc...
...
}
// In the function that is created for you when button is clicked (I'm not sure if I get the signature right below.
void OnClick(EventArgs^ e)
{
...
hr = m_pHandler->onButtonPressed();
...
}
Затем вы можете передать любой параметр вы определяете для функции onButtonPressed как только кнопка нажата.
большое спасибо за приятный ответ – user1494936