Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Требуется подключить к проекту на Free Basic сишную lib

5 views
Skip to first unread message

Andrew Shelkovenko

unread,
May 20, 2008, 8:02:26 AM5/20/08
to
Hello, All!

Требуется подключить к проекту на Free Basic библиотеку lib
Поспрашивал на из форуме
http://www.freebasic.net/forum/viewtopic.php?t=11459
сделал так

'----------------
#inclib "NIDAQmx"
type TaskHandle as UInteger

' это определения из сишного заголовочного файла
'typedef uInt32 TaskHandle;
'int32 __CFUNC DAQmxCreateTask (const char taskName[], TaskHandle
*taskHandle);

Declare Function DAQmxCreateTask Alias "_DAQMXCREATETASK" ( _
Byval taskName As Zstring Ptr, byref taskHandle as Uinteger ) As Integer

taskname$="11111111111111111"
dim MyTaskHandle as UInteger

MyTaskHandle=999
otv=999

otv= DAQmxCreateTask(str2,MyTaskHandle)
print"otv=";otv
'---------------------
выдает ошибку
C:\bas\RapidQ\RQIDE\FrreBasicLibTest1.o:fake:(.text+0x67): undefined
reference to `DAQmxCreateTask'

Все варианты попробовал cdecl, stdcall
варианты
Declare Function DAQmxCreateTask Alias "DAQmxCreateTask" ( _
Declare Function DAQmxCreateTask Alias DAQmxCreateTask@8 ( _

итд
все одна и та же ошибка

В самой либе написано в разных местах
_DAQmxCreateTask@8

__imp__DAQmxCreateTask@8

_DAQmxCreateTask@8[ascii0]nicaiu.dll


В какую сторону можно еще покопать?


Может можно написать обертку dll - ку на С, и через нее уже вызывать
либовские функции?


With best regards, Andrew Shelkovenko.
RQ SpamFinish Lite - http://spamfinish.miraxem.com


Oleg Bekhter

unread,
May 21, 2008, 2:00:11 PM5/21/08
to
On May 20, 3:02 pm, "Andrew Shelkovenko" <mira...@mira.xeno.ru> wrote:
>
> Требуется подключить к проекту на Free Basic библиотеку lib
> Поспрашивал на из форумеhttp://www.freebasic.net/forum/viewtopic.php?t=11459
[skipped]

>
> В какую сторону можно еще покопать?

Я делал через COM-обертку. Basic по другому не победил.
У меня, правда, С++ был, но с С еще проще

Andrew Shelkovenko

unread,
May 22, 2008, 7:22:22 AM5/22/08
to
Hello, Oleg!

You wrote to Andrew Shelkovenko on Wed, 21 May 2008 18:00:11 +0000 (UTC):

>> Требуется подключить к проекту на Free Basic библиотеку lib

OB> [skipped]


>> В какую сторону можно еще покопать?

OB> Я делал через COM-обертку. Basic по другому не победил.
OB> У меня, правда, С++ был, но с С еще проще

Фактически мне надо для RapidQ basic.
В принципе образец dll мне сделали, она работает сама по себе, из basic
вызывается.
Проблема в том, что в ней не отрабатывается правильно вызов функции уже из
lib библиотеки.


Hемного опишу что есть, хотя это в основном вопросы для cpp.chainik

функции DAQmxCreateTask передается taskName
и возращается TaskHandle (uint32)

вот так функция описывается в NIDAQmx.h для NIDAQmx.lib


int32 __CFUNC DAQmxCreateTask (const char taskName[],
TaskHandle *taskHandle);

вот так она вызывается из работающего модуля написанного на CPP
if (DAQmxCreateTask("",&MyTaskHandle)!=0) ShowMessage("Ошибка подключения");

вот кусок кода dll обертки (Borland studio 2006)
//--------------------------------------------------------------------------
-

#include <vcl.h>
#include <stdio.h>
#include <windows.h>
#pragma hdrstop
#define _DLLMAINCPP // обратите на эту строчку внимание
#include "dllmain.h"
#define _APPMAINCPP
#pragma argsused
#include "NIDAQmx.h"

//--------------------------------------------------------------------------
-
DAQmxCreateTask_dll(const char taskName, unsigned long LPMyTaskHandle)
{
// пытаюсь посмотреть, что передалось в качестве taskName
printf("taskName= %s \n",taskName );
ShowMessage(taskName); / показывает одну букву А

unsigned long MyTaskHandle3;
int otv;
{
otv = DAQmxCreateTask(&taskName,&MyTaskHandle3);
LPMyTaskHandle = MyTaskHandle3;
}
return otv;// 10;//
}
//------------------

1. выдает предупрежедение
типа LPMyTaskHandle пытается assign to unused value MyTaskHandle3

2. Почему у функции DAQmxCreateTask_dll не указывается тип возвращаемого
значения??
3. чем отличается const char taskName[] в описании функции NIDAQmx.h
от const char taskName в определении функции в Dll?


Может сразу видно, что что-то неправильно?

Oleg Bekhter

unread,
May 31, 2008, 3:29:11 PM5/31/08
to
On May 22, 2:22 pm, "Andrew Shelkovenko" <mira...@mira.xeno.ru> wrote:
> Hello, Oleg!
> You wrote to Andrew Shelkovenko on Wed, 21 May 2008 18:00:11 +0000 (UTC):
>
> >> Требуется подключить к проекту на Free Basic библиотеку lib
> OB> [skipped]
> >> В какую сторону можно еще покопать?
>
> OB> Я делал через COM-обертку. Basic по другому не победил.
> OB> У меня, правда, С++ был, но с С еще проще
>
> Фактически мне надо для RapidQ basic.
> В принципе образец dll мне сделали, она работает сама по себе, из basic
> вызывается.
> Проблема в том, что в ней не отрабатывается правильно вызов функции уже из
> lib библиотеки.
Попробуем разобраться...

> Hемного опишу что есть, хотя это в основном вопросы для cpp.chainik
>
> функции DAQmxCreateTask передается taskName
> и возращается TaskHandle (uint32)
>
> вот так функция описывается в NIDAQmx.h для NIDAQmx.lib
> int32 __CFUNC DAQmxCreateTask (const char taskName[],
> TaskHandle *taskHandle);
>
> вот так она вызывается из работающего модуля написанного на CPP
> if (DAQmxCreateTask("",&MyTaskHandle)!=0) ShowMessage("Ошибка подключения");
>
> вот кусок кода dll обертки (Borland studio 2006)
> //---------------------------------------------------------------------------
> -
>
> #include <vcl.h>
> #include <stdio.h>
> #include <windows.h>
> #pragma hdrstop
> #define _DLLMAINCPP // обратите на эту строчку внимание
> #include "dllmain.h"
> #define _APPMAINCPP
> #pragma argsused
> #include "NIDAQmx.h"
>
> //---------------------------------------------------------------------------
> -
> DAQmxCreateTask_dll(const char taskName, unsigned long LPMyTaskHandle)
> {

Здесь явная лажа должно быть так
DAQmxCreateTask_dll(const char *taskName, unsigned long
*LPMyTaskHandle)

> // пытаюсь посмотреть, что передалось в качестве taskName
> printf("taskName= %s \n",taskName );
> ShowMessage(taskName); / показывает одну букву А

Повезло, а могло и свалиться -:)

> unsigned long MyTaskHandle3;
> int otv;
> {
> otv = DAQmxCreateTask(&taskName,&MyTaskHandle3);

otv = DAQmxCreateTask( taskName, &MyTaskHandle3 );


> LPMyTaskHandle = MyTaskHandle3;
*LPMyTaskHandle = MyTaskHandle3;

> }
> return otv;// 10;//}
>
> //------------------
>
> 1. выдает предупрежедение
> типа LPMyTaskHandle пытается assign to unused value MyTaskHandle3

Покажи как описана
??? DAQmxCreateTask( ???, ???)

>
> 2. Почему у функции DAQmxCreateTask_dll не указывается тип возвращаемого
> значения??

По умолчанию int

> 3. чем отличается const char taskName[] в описании функции NIDAQmx.h
> от const char taskName в определении функции в Dll?

const char taskName - это один символ
const char taskName[] - это строка

>
> Может сразу видно, что что-то неправильно?

Угу, похоже ВСЕ -:)


Andrew Shelkovenko

unread,
Jun 1, 2008, 5:54:05 PM6/1/08
to
Hello, Oleg!

You wrote to Andrew Shelkovenko on Sat, 31 May 2008 19:29:11 +0000 (UTC):

>> >> Требуется подключить к проекту на Free Basic библиотеку lib
>> OB>

>> OB> [skipped]


Спасибо за ответы!
Проблема снялась тем, что нашлась работающая dll. ;)

With best regards, Andrew Shelkovenko.

http://spamfinish.com - SpamFinish


0 new messages