Требуется подключить к проекту на 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
>
> В какую сторону можно еще покопать?
Я делал через COM-обертку. Basic по другому не победил.
У меня, правда, С++ был, но с С еще проще
>> Требуется подключить к проекту на 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?
Может сразу видно, что что-то неправильно?
> 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[] - это строка
>
> Может сразу видно, что что-то неправильно?
Угу, похоже ВСЕ -:)
>> >> Требуется подключить к проекту на Free Basic библиотеку lib
>> OB>
>> OB> [skipped]
Спасибо за ответы!
Проблема снялась тем, что нашлась работающая dll. ;)
With best regards, Andrew Shelkovenko.
http://spamfinish.com - SpamFinish