BCB 呼叫DLL的問題 |
答題得分者是:syntax
|
Patil
一般會員 發表:4 回覆:7 積分:2 註冊:2010-02-23 發送簡訊給我 |
我的DLL檔案是由LabVIEW產生的,同時也產生了H與Lib檔案。
H檔的內容如下: [code cpp] #include "extcode.h" #pragma pack(push) #pragma pack(1) #ifdef __cplusplus extern "C" { #endif int16_t __cdecl LED(float UpperBound, float LowerBound, float LED_ON_Limit, int32_t Coordinates[], int32_t GlobalRectangle[], int32_t len, int32_t len2); long __cdecl LVDLLStatus(char *errStr, int errStrLen, void *module); #ifdef __cplusplus } // extern "C" #endif #pragma pack(pop)[/code] 我使用的方式是在主專案內的H檔先宣告函數,如下: [code cpp] #ifndef mainH #define mainH //--------------------------------------------------------------------------- #include #include #include #include <Forms.hpp><br />#include "MyLED.h" //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; TListBox *ListBox1; void __fastcall Button1Click(TObject *Sender); void __fastcall FormClick(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif //底下這行是我定義的DLL檔中函數的內容 int16_t __declspec(dllimport) __cdecl LED(float UpperBound, float LowerBound, float LED_ON_Limit,int32_t Coordinates[], int32_t GlobalRectangle[], int32_t len, int32_t len2); [/code] 以下是main檔 [code cpp] void __fastcall TForm1::Button1Click(TObject *Sender) { int global[4]={146,233,168,257}; int *ptr1=global; int contour[4]={146,233,168,257}; int *ptr2=contour; float upper=50,lower=0; bool out; out=LED(upper,lower,0,ptr1,ptr2,sizeof(global),sizeof(contour)); if(out==true) { ListBox1->Color=clGreen; } else { ListBox1->Color=clRed; } } [/code] 但是卻出現如下的Error,但是我在我的專案中卻有發現MAIN.OBJ,所以想請教問題是出在哪? 或是我在call函數有錯誤引用方式呢? [Linker Error] Unresolved external '_LED' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\TEST\MAIN.OBJ |
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
你自己已經說出答案了
--->我的DLL檔案是由LabVIEW產生的,同時也產生了H與Lib檔案。 --->H檔的內容如下: extern "C" <------- 加了嗎? ===================引 用 Patil 文 章=================== 我的DLL檔案是由LabVIEW產生的,同時也產生了H與Lib檔案。 H檔的內容如下: [code cpp] #include "extcode.h" #pragma pack(push) #pragma pack(1) #ifdef __cplusplus extern "C" { #endif int16_t __cdecl LED(float UpperBound, float LowerBound, float LED_ON_Limit, int32_t Coordinates[], int32_t GlobalRectangle[], int32_t len, int32_t len2); long __cdecl LVDLLStatus(char *errStr, int errStrLen, void *module); #ifdef __cplusplus } // extern "C" #endif #pragma pack(pop)[/code] 我使用的方式是在主專案內的H檔先宣告函數,如下: [code cpp] #ifndef mainH #define mainH //--------------------------------------------------------------------------- #include #include #include #include <forms.hpp><br />#include "MyLED.h" //--------------------------------------------------------------------------- class TForm1 : public TForm { __published:// IDE-managed Components TButton *Button1; TListBox *ListBox1; void __fastcall Button1Click(TObject *Sender); void __fastcall FormClick(TObject *Sender); private:// User declarations public:// User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif //底下這行是我定義的DLL檔中函數的內容 int16_t __declspec(dllimport) __cdecl LED(float UpperBound, float LowerBound, float LED_ON_Limit,int32_t Coordinates[], int32_t GlobalRectangle[], int32_t len, int32_t len2);</forms.hpp></stdctrls.hpp> [/code] 以下是main檔 [code cpp] void __fastcall TForm1::Button1Click(TObject *Sender) { int global[4]={146,233,168,257}; int *ptr1=global; int contour[4]={146,233,168,257}; int *ptr2=contour; float upper=50,lower=0; bool out; out=LED(upper,lower,0,ptr1,ptr2,sizeof(global),sizeof(contour)); if(out==true) { ListBox1->Color=clGreen; } else { ListBox1->Color=clRed; } } [/code] 但是卻出現如下的Error,但是我在我的專案中卻有發現MAIN.OBJ,所以想請教問題是出在哪? 或是我在call函數有錯誤引用方式呢? [Linker Error] Unresolved external '_LED' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\TEST\MAIN.OBJ |
Patil
一般會員 發表:4 回覆:7 積分:2 註冊:2010-02-23 發送簡訊給我 |
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
|
lgl_debug
一般會員 發表:0 回覆:1 積分:0 註冊:2008-09-21 發送簡訊給我 |
(1).impdef.exe
用法:impdef.exe deffile.def yourdll.dll 生成指定DLL文件的def文件,可以用它来查看DLL中的函数声明。例如,BCB使用VC的DLL时, 可能需要查看一下VC中导出函数的函数名;或者未使用extern "C"调用约定时,可以用它来 查看DLL中导出函数的C 命名方式,从而可以正确调用。 (2).implib.exe "注意RAD2010 用-a 才可以生成被BCB调用的LIB" /*CodeGear Implib Version 3.2.0 Copyright (c) 1991-2009 CodeGear Syntax: IMPLIB [options] libname[.lib] [@respfile | srcname] [srcname ...] Options: -a Add '_' alias for MS flavor cdecl functions -aa Force the alias even if the function already starts with '_' -c Case sensitive symbols -f Force imports by name (with hints) -w No Warnings Respfile may contain a list of source files to process. Wildcards are ok for .DLL and .DEF file names.*/ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |