Подключение Dll к Visual C++ 2005

  • Автор темы mike2007
  • Дата начала
Статус
Закрыто для дальнейших ответов.
M

mike2007

Гость
#1
Помогите пожалуйста уже неделю не могу разобраться с этем.

DLL(sampel.dll) с функциями:
int Picture_windows();
int CVICALLBACK BinarySwitchData();
int CVICALLBACK NumericKnobData();
int CVICALLBACK QuitCallback();

Как запустить функцию "int Picture_windows();" в DLL-ке, созданной в LabView8/CVI, которая выводит на экран элементы: ручки, лампочки и т.д., в проекте Win32.

А это код проекта С++

Код:
#include <windows.h>
#include "stdafx.h"
#include "sam.h"

#define MAX_LOADSTRING 100

// Global Variables:
HWND hwndEdit;		// Окно редактирования
HINSTANCE hInst,hRTFLib;								// current instance

char szTitle[MAX_LOADSTRING] = "Топливо и масло";					// The title bar text
//TCHAR szTitle[MAX_LOADSTRING];					// The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];			// the main window class name

// Forward declarations of functions included in this code module:
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK	About(HWND, UINT, WPARAM, LPARAM);


int WINAPI _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR	lpCmdLine,
int	  nCmdShow)
{
//UNREFERENCED_PARAMETER(hPrevInstance);
//UNREFERENCED_PARAMETER(lpCmdLine);
MSG msg;
HACCEL hAccelTable;

//LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_SAM, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_SAM));
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}



ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX ************;

************.cbSize = sizeof(WNDCLASSEX);

************.style			= CS_HREDRAW | CS_VREDRAW;
************.lpfnWndProc	= WndProc;
************.cbClsExtra		= 0;
************.cbWndExtra		= 0;
************.hInstance		= hInstance;
************.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SAM));
************.hCursor		= LoadCursor(NULL, IDC_ARROW);
************.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
************.lpszMenuName	= MAKEINTRESOURCE(IDC_SAM);
************.lpszClassName	= szWindowClass;
************.hIconSm		= LoadIcon(************.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(&************);
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;

hInst = hInstance; // Store instance handle in our global variable

hWnd = CreateWindowEx(
0,					// Расширенный стиль окна
szWindowClass,		// Имя класса окна
szTitle,	// Заголовок окна
WS_OVERLAPPEDWINDOW,// Стиль окна
CW_USEDEFAULT,		// x
CW_USEDEFAULT,		// y
CW_USEDEFAULT,		// ширина
CW_USEDEFAULT,		// высота
NULL,				// Хэндл родителя (отсутствует)
NULL,				// Хэндл меню (отстутствует)
hInstance,				// Хэндл приложения
NULL
);				// Указатель на область данных

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}
BOOL WndProc_OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
/* Выполняется при создании окна */
{
RECT rc;


hRTFLib = LoadLibrary("sample.dll");

if (hRTFLib == 0)
{
MessageBox(0,_T("Модуль кригинга не найден!"),0,MB_ICONERROR);
return false;
}
//_declspec(dllimport) int _cdecl Picture_windows();
Picture_windows();
GetClientRect(hwnd, &rc);
/*
hwndEdit = CreateWindowEx(
NULL,		// Расширенный стиль окна
"RICHEDIT",	// Класс окна редактирования
NULL,		// Текст в окне по умолчанию
WS_VISIBLE | WS_CHILD | WS_BORDER | WS_HSCROLL | WS_VSCROLL | ES_NOHIDESEL |
ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_MULTILINE ,
0, 0, rc.right - rc.left, rc.bottom - rc.top,
hwnd,		// Родительское окно
NULL,		// Меню
hInst,		// Дескриптор приложения
NULL);		// Указатель на CREATESTRUCT
*//*| ES_SAVESEL*/
//PopFileInitialize(hwnd);

SetFocus(hwndEdit);

return TRUE;
} // WndProc_OnCreate
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{
HANDLE_MSG(hWnd, WM_CREATE, WndProc_OnCreate);		// Создание окна	
case WM_COMMAND:
wmId	= LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

// Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;

case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
Ошибка: error C3861: 'Picture_windows': identifier not found
Вот не могу понять, как должны прорисоваться все элементы.

И не знаю как добавить DLL к проекту С++.
 

Kmet

Well-Known Member
Java Team
25.05.2006
1 036
8
#2
ну для начала стоило бы разобраться что такое статическое и динамическое подключение. в твоем случе смотри на GetProcAddress.
 
M

mike2007

Гость
#3
Все библиотека подключена из LabView\CVI, только не работает.
Можно вообще каким-либо образом заствить работать функцию LoadPanel (0, "mydll.uir", PANEL) совместно с
int CVICALLBACK DataNUMERICTANK
int CVICALLBACK DataNUMERICGAUGE
int CVICALLBACK QuitCallback
в С++.
У меня ошибка такого рода в С++:
The callback function, DataNUMERICTANK, specified in UIR file, is not know function. If you are using an external cmpiler, you must include the UIR callback object or source file in the executable or DLL

Вот код:
Код:
BOOL WndProc_OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
/* Выполняется при создании окна */
{
RECT rc;


hRTFLib = LoadLibrary("mydll.dll");

if (hRTFLib == 0)
{
MessageBox(0,_T("DLL не найдена!"),0,MB_ICONERROR);
return false;
}
/* 
определяем при помощи typedef новый тип - указатель на вызываемую функцию. 
Очень важно знать типы и количество аргументов, а также тип возвращаемого 
результата 
*/
typedef int (*PMyDll)(/*const int, const int*/);
/* пытаемся получить адрес функции getSum */
PMyDll pMyDll = (PMyDll)GetProcAddress(hRTFLib, "Write_pic");
/* проверяем успешность получения адреса */
if (pMyDll == NULL)
{
MessageBox(0,_T("Функция не найдена!"),0,MB_ICONERROR);
return false;
}
int iCode =(*pMyDll)();
Все библиотека подключена из LabView\CVI, только не работает.
Можно вообще каким-либо образом заствить работать функцию LoadPanel (0, "mydll.uir", PANEL) совместно с
int CVICALLBACK DataNUMERICTANK
int CVICALLBACK DataNUMERICGAUGE
int CVICALLBACK QuitCallback
в С++.
У меня ошибка такого рода в С++:
The callback function, DataNUMERICTANK, specified in UIR file, is not know function. If you are using an external cmpiler, you must include the UIR callback object or source file in the executable or DLL

Вот код:
Код:
BOOL WndProc_OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
/* Выполняется при создании окна */
{
RECT rc;


hRTFLib = LoadLibrary("mydll.dll");

if (hRTFLib == 0)
{
MessageBox(0,_T("DLL не найдена!"),0,MB_ICONERROR);
return false;
}
/* 
определяем при помощи typedef новый тип - указатель на вызываемую функцию. 
Очень важно знать типы и количество аргументов, а также тип возвращаемого 
результата 
*/
typedef int (*PMyDll)(/*const int, const int*/);
/* пытаемся получить адрес функции getSum */
PMyDll pMyDll = (PMyDll)GetProcAddress(hRTFLib, "Write_pic");
/* проверяем успешность получения адреса */
if (pMyDll == NULL)
{
MessageBox(0,_T("Функция не найдена!"),0,MB_ICONERROR);
return false;
}
int iCode =(*pMyDll)();
 
M

mike2007

Гость
#4
Прописал в LabView8/CVI :
Код:
#ifdef __cplusplus
extern "C" {
#endif


void __cdecl OpenPanel();


#ifdef __cplusplus
}
#endif
Все равно ошибка, в VC++:
testDLLDlg.obj : error LNK2001: unresolved external symbol "void __cdecl OpenPanel(void)" (?OpenPanel@@YAXXZ)
Debug/testDLL.exe : fatal error LNK1120: 1 unresolved externals

Что с ней делать не могу понять.
Помогите Пожалуйста!
 
N

Ninetta

Гость
#5
А у меня такой вопрос - если я статически подключаю библиотеку, достаточно всего лишь строчки
#pragma comment(lib, "NeuroNet.lib") ???

И как теперь пользоваться функциями этой билиотеки? Почему в ClassView она не отображается???

Заранее спасибо.
 
Статус
Закрыто для дальнейших ответов.