送分! ( 积分: 100 )

  • 主题发起人 主题发起人 pascal
  • 开始时间 开始时间
P

pascal

Unregistered / Unconfirmed
GUEST, unregistred user!
头文件:control.h
#ifdef __BUILDING_THE_DLL
#define XPORT_TYPE __declspec(dllexport) //__export
#else
#define XPORT_TYPE __declspec(dllimport) //__import
#endif
extern XPORT_TYPE _stdcall BOOL Init(const char *Device);
extern XPORT_TYPE _stdcall void Close();
extern XPORT_TYPE _stdcall BOOL Open(const int Addr);
extern XPORT_TYPE _stdcall BOOL GetStatus(const int Addr, int *Status);
extern XPORT_TYPE _stdcall BOOL GetCount(int *Count);
DLL工程程序文件:control.cpp
#define __BUILDING_THE_DLL
#include <windows.h>
#include <assert.h>
#include &quot;DllUnit.h&quot;
#pragma argsused
//---------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
extern XPORT_TYPE _stdcall BOOL Init(const char *Device)
{
//内容略
};
//其他几个函数同,略
调用工程程序:porte.cpp,头文件同上
#include <vcl.h>
#include <assert.h>
#include <mem.h>
#pragma hdrstop
#include &quot;Unit1.h&quot;
#include &quot;DLLUnit.h&quot;
//---------------------------------------------------------------------------
#pragma link &quot;CSPIN&quot;
#pragma comment(lib, &quot;Control.lib&quot;)
#pragma resource &quot;*.dfm&quot;
TForm1 *Form1;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
if (!InitComm(&quot;DEVICE1&quot;))
{
Application->MessageBox(&quot;设备占用!&quot;, &quot;可惜&quot;, MB_OK);
Application->Terminate();
}
}
以下略;
请帮忙侃侃DLL输出/输入对没?我在C++BUILDER中静态调用运行正常,但动态调用或DELPHI不能调用DLL,老说没找到相应的函数人口?
 
头文件:control.h
#ifdef __BUILDING_THE_DLL
#define XPORT_TYPE __declspec(dllexport) //__export
#else
#define XPORT_TYPE __declspec(dllimport) //__import
#endif
extern XPORT_TYPE _stdcall BOOL Init(const char *Device);
extern XPORT_TYPE _stdcall void Close();
extern XPORT_TYPE _stdcall BOOL Open(const int Addr);
extern XPORT_TYPE _stdcall BOOL GetStatus(const int Addr, int *Status);
extern XPORT_TYPE _stdcall BOOL GetCount(int *Count);
DLL工程程序文件:control.cpp
#define __BUILDING_THE_DLL
#include <windows.h>
#include <assert.h>
#include &quot;DllUnit.h&quot;
#pragma argsused
//---------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
extern XPORT_TYPE _stdcall BOOL Init(const char *Device)
{
//内容略
};
//其他几个函数同,略
调用工程程序:porte.cpp,头文件同上
#include <vcl.h>
#include <assert.h>
#include <mem.h>
#pragma hdrstop
#include &quot;Unit1.h&quot;
#include &quot;DLLUnit.h&quot;
//---------------------------------------------------------------------------
#pragma link &quot;CSPIN&quot;
#pragma comment(lib, &quot;Control.lib&quot;)
#pragma resource &quot;*.dfm&quot;
TForm1 *Form1;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
if (!InitComm(&quot;DEVICE1&quot;))
{
Application->MessageBox(&quot;设备占用!&quot;, &quot;可惜&quot;, MB_OK);
Application->Terminate();
}
}
以下略;
请帮忙侃侃DLL输出/输入对没?我在C++BUILDER中静态调用运行正常,但动态调用或DELPHI不能调用DLL,老说没找到相应的函数人口?
 
如果是DLL,则CB也能调用,那应该是DELPHI的定义有没有问题
 
郁闷中:用VC的dependency看DLL,发现输出的函数名变了:
init ==> @init$qqspxc
close ==> @close$qqsv
open ==> @open$qqsxi
getstatus ==> @getstatus$qqsxii
why??????
到底是什么函数名字?
 
CB采用动态调用DLL的办法也不行
谁给个例子啊
1.DLL
2.静态调用
3.动态调用
C的语法不太熟:_stdcall和__stdcall有什么区别?(即什么时候用 _ 和 __ )
帮助文件:
__export void f(void);
// illegal 为什么不行???
void __export f(void) // correct
void __declspec(dllexport) f(void);
// correct
__declspec(dllexport)void f(void);
// correct
class __declspec(dllexport) ClassName { } // correct
 
头文件:control.h
#ifdef __BUILDING_THE_DLL
#define XPORT_TYPE __declspec(dllexport) //__export
#else
#define XPORT_TYPE __declspec(dllimport) //__import
#endif
DLL工程程序文件:control.cpp
#define __BUILDING_THE_DLL
把__BUILDING_THE_DLL改了其他名字就不能输出函数了(用depende看),为什么?
没事了,文件夹不对,二个版本
 
调用程序:
[Linker error]unresoled external '__stdcall open(int) referenced from:unit1.obj
只有这一个,何解?头文件的声明是从实现文件.cpp处拷过来的,不可能有差异啊,而且其他都行?
没事了,文件夹不对,二个版本
 
问题找到:
extern XPORT_TYPE _stdcall BOOL Init(const char *Device);
改为
extern &quot;C&quot;
XPORT_TYPE _stdcall BOOL Init(const char *Device);
标准C调用.
只剩这个容易的啦:
:_stdcall和__stdcall有什么区别?(即什么时候用 _ 和 __ )
帮助文件:
__export void f(void);
// illegal 为什么不行???
void __export f(void) // correct
void __declspec(dllexport) f(void);
// correct
__declspec(dllexport)void f(void);
// correct
class __declspec(dllexport) ClassName { } // correct
 
100分啊!
这么容易的都没人理!!!!
简直没天理啦
只剩这个容易的啦:
:_stdcall和__stdcall有什么区别?(即什么时候用 _ 和 __ )
帮助文件:
__export void f(void);
// illegal 为什么不对???
void __export f(void) // correct 为什么对???
void __declspec(dllexport) f(void);
// correct
__declspec(dllexport)void f(void);
// correct
class __declspec(dllexport) ClassName { } // correct
 
还容易啊?我看天书呢
 
__stdcall 函数的参数被从右到左推送到堆栈上,被调用函数在返回之前从堆栈中弹出这些参数。
对于 C,__stdcall 命名约定使用以下划线 ( _ ) 开头的函数名,后跟“at”符 (@) 和函数参数大小(以字节为单位)。不执行任何大小写转换。编译器使用下列命名约定模板:
_functionname@number
 
to:kgm
这贴你等于没答,不过关于GUID哪贴就是你说的对,该给分你的,但那贴本来是用旧贴给BBSCOM分的,就没给你,在这贴补吧,等结贴先啊
 
If you use non-ANSI keywords in a program and you want the program to be ANSI compliant, always use the non-ANSI keyword versions that are prefixed withdo
uble underscores. Some keywords have a version prefixed with only one underscore;
these keywords are provided to facilitate porting code developed with other compilers. For ANSI-specified keywords there is only one version.
 
只剩这个容易的啦:
__export void f(void);
// illegal 为什么不对???
void __export f(void) // correct 为什么对???
void __declspec(dllexport) f(void);
// correct
__declspec(dllexport)void f(void);
// correct
class __declspec(dllexport) ClassName { } // correct
 
后退
顶部