Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Заполнение TListBox

507
08 февраля 2003 года
PASS
45 / / 20.09.2000
Имеется небольшая программка, в ней всего одна форма, а на форме - 2 компонента TListBox. К программе подключается DLL, в которой есть функция для заполнения этих списков. Параметры этой функции - Handle'ы ListBox'ов. Вопрос: как можно добавлять/удалять элементы из этих списков, используя только WinAPI (т.е. не используя VCL в DLL)? В справке я нашел похожие функции, применимые к TListView, но боюсь, что ListView будет слишком "круто" для этой программы...
507
08 февраля 2003 года
PASS
45 / / 20.09.2000
Хм... я, вроде, разобрался с функциями WinAPI, и библиотека нормально скомпилировалась, но при компиляции главного приложения, использующего библиотеку, Builder пишет:
[COLOR=darkblue][Linker error] Unresolved external <здесь имя функции> referenced from <здесь имя OBJ-файла>[/COLOR].
Я уже 20 раз всё проверил, но безрезультатно... Может, кто знает, в чем тут дело?
2.1K
09 февраля 2003 года
alex_kan
13 / / 08.01.2003
Цитата:
Originally posted by PASS
Хм... я, вроде, разобрался с функциями WinAPI, и библиотека нормально скомпилировалась, но при компиляции главного приложения, использующего библиотеку, Builder пишет:
[COLOR=darkblue][Linker error] Unresolved external <здесь имя функции> referenced from <здесь имя OBJ-файла>[/COLOR].
Я уже 20 раз всё проверил, но безрезультатно... Может, кто знает, в чем тут дело?



Вот справка по этой ошибке из Билдера, к сожалению в этом не сильно селён, так что переводи и смотри
Specialized SCL String and Stream classes and Unresolved Externals Error messages
Syntax

#define _RWSTD_COMPILE_INSTANTIATE

Description

In order to reduce object file size and improve link times,some specialized SCL stream and string classes exist in the current RTL (Runtime Library). The system used to achieve this separation results in the compiler being unable to generate template instantiations for certain string and stream classes. To work around this, it is necessary to define _RWSTD_COMPILE_INSTANTIATE prior to including the SCL string and stream class header files. This should only be necessary if you are attempting to use an SCL based string or stream class based on a type other than char and wchar_t.

Example

#define _USE_OLD_RW_STL

#define _RWSTD_COMPILE_INSTANTIATE
#include <string>
#include <iostream>

//using std::string;
using std::cout;
using std::endl;
typedef std::basic_string<unsigned char> u_string;

#pragma argsused
int main(int argc, char* argv[])
{
u_string s((unsigned char *)"Test");
cout << s.c_str() << endl;
return 0;

}

507
09 февраля 2003 года
PASS
45 / / 20.09.2000
2 alex_kan

В конце написано (перевожу дословно): Это необходимо, если вы пытаетесь использовать строковые типы SCL или поточные классы, основанные не на char или wchar_t.

Моя библиотека использует только char для работы со строками. Так что проблема остается. Может, кто знает, в чем дело?
362
10 февраля 2003 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by PASS
Хм... я, вроде, разобрался с функциями WinAPI, и библиотека нормально скомпилировалась, но при компиляции главного приложения, использующего библиотеку, Builder пишет:
[COLOR=darkblue][Linker error] Unresolved external <здесь имя функции> referenced from <здесь имя OBJ-файла>[/COLOR].
Я уже 20 раз всё проверил, но безрезультатно... Может, кто знает, в чем тут дело?



так он пишет только в том случае, если шдалвное приложение видит описание функции - Н-файл DLL и компилятор все нормально компилирует, а при компоновке линкер не находит реализацю функции. Реализацию он ищет либо о обьектных модулях проекта, либо в подключенных Lib'ах. Иначе нигде, по-моему. Ты точно добавил к главному проекту Lib-файл от DLL?

507
10 февраля 2003 года
PASS
45 / / 20.09.2000
Цитата:
Originally posted by _kolyan


так он пишет только в том случае, если шдалвное приложение видит описание функции - Н-файл DLL и компилятор все нормально компилирует, а при компоновке линкер не находит реализацю функции. Реализацию он ищет либо о обьектных модулях проекта, либо в подключенных Lib'ах. Иначе нигде, по-моему. Ты точно добавил к главному проекту Lib-файл от DLL?



Да, всё добавил и 30 раз проверил - безрезультатно....

2.5K
12 февраля 2003 года
weiss
21 / / 10.02.2003
Цитата:
Originally posted by PASS


Да, всё добавил и 30 раз проверил - безрезультатно....



дак ты напиши хоть что за функция, чтоб проверить можно было

507
12 февраля 2003 года
PASS
45 / / 20.09.2000
Цитата:
Originally posted by weiss


дак ты напиши хоть что за функция, чтоб проверить можно было



Ну вот смотри:

1. Код DLL.cpp

Код:
#include <windows.h>
#include <windowsx.h>
#include "DLL.h"
#pragma argsused

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}

// Функция для заполнения ListBox'ов
void FillListBoxes ( char *UserName, HWND List1, HWND List2 )
{
for ( int i = 0; i < 100; i++ )
        {
        ListBox_AddString ( List1, &UserName );
        ListBox_AddString ( List2, &UserName );
        }
}


2. Код DLL.h

 
Код:
#ifdef __BUILDING_THE_DLL
#define __EXPORT_TYPE __export
#else
#define __EXPORT_TYPE __import
#endif

void __EXPORT_TYPE FillListBoxes ( char *UserName, HANDLE List1, HANDLE List2 );


3. Ну и, наконец, в вызывающем приложении:

 
Код:
...
#include "DLL.h"
...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
FillListBoxes ( "Vasya", ListBox1->Handle, ListBox2->Handle );
}


Такой простой код не работает. В чем проблема?
2.5K
12 февраля 2003 года
weiss
21 / / 10.02.2003
ну дак у тебя всё нахрен неправильно
кто же так делает?

ты определись. или ты длл используешь
или импортируешь функцию себе...

я, конечно, не спец, но...

вариант 1.
- подключаешь h файл,
- при линковке функция должна выдёргиваться
и вставляться в твой объектный файл,
- всё это дело компилируется.

вариант 2.
- подключаешь библиотеку (стат., дин.)
- вызываешь нужную функцию оттуда


то, что ты написал, похоже на вариант 1,
только тело функции не импортируется, ибо
нету... соответственно косяк: прототип есть,
а вызывать нечего.
362
13 февраля 2003 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by weiss
ну дак у тебя всё нахрен неправильно
кто же так делает?

ты определись. или ты длл используешь
или импортируешь функцию себе...

я, конечно, не спец, но...



не стоит так громко выражаться я таком случае. Функция DLL не компилируется в обьектный файл - в чем смысл тогда мспользовать DLL.
А в этом случае действительно Unresolved external reference, я бы на месте компилятора тоже так сказал :-))) функция обьявленная в DLL.cpp это локальная функция DLL, ее не будет видно снаружи. В H-файле она оьявлена как __export а в СРР-файле нет - естественно она не будет экспортироваться - это, фактически две разные функции, точнее одна -локальная и прототип второй экспортной, но без тела

2.5K
13 февраля 2003 года
weiss
21 / / 10.02.2003
если внимательно прочитаешь, то поймёшь, что именно об этом я и говорил.
чувак сделал дээлэлину, а пытается функцию включить в свой объектный файл, в чем смысл - я сам его не понял.
извините, если непонятно выразился.
362
13 февраля 2003 года
_kolyan
339 / / 03.12.2002
я понял что мы говорили об одном и том же.
но он не пытается встроить ничего в обьектник - по крайней мере в том коде которой написан. Главное приложение включит файл DLL.h в котром макрос __BUILDING_THE_DLL по идее не должен быть определен и поэтому функция будет __import и приложение будет искать ее в подключенных к проекту LIB'ах, а в LIB'ах ее нет, потому чтопри компоновке DLL она не вола в раздел экспорт.
Это правильный код, толлько нужно проследить чтобы в главном приложении не был определем макрос __BUILDING_THE_DLL и в файле DLL.cpp при реализации функции дописать __EXPORT_TYPE и все должно работать (у меня в таких случаях работает :-)))
2.5K
13 февраля 2003 года
weiss
21 / / 10.02.2003
наверное, всё так и есть, как ты говоришь...
либами я пользоваться не умею :(
507
13 февраля 2003 года
PASS
45 / / 20.09.2000
Спасибо, я наконец понял, где ошибка.

Действительно, я сделал тупую ;) ошибку и не замечал её в течение очень долгого времени. Спасибо, что на свете есть более внимательные люди. ;)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог