一个DLL调用的问题,蹊跷的函数类型声明
我的目的是想调用aspriseOCR.dll,里面有个函数,类型定义如下:
String OCR(String filename,int type)
功能是识别图片中的数字和文本。
静态调用主体如下:(已经把lib文件加入工程)
TForm1 *Form1;
extern "C " __declspec(dllimport) __stdcall String OCR(String,int);
//------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Edit5-> Text=OCR( "E:\\a.bmp ",-1);
如果在extern "C " __declspec(dllimport) __stdcall String OCR(String,int);
中声明OCR返回值为String,执行没出错信息,但也没有返回结果。
如果写成extern "C " __declspec(dllimport) __stdcall OCR(String,int);
即把OCR的返回值设为缺省,(应当为int吧?),这时运行没出错,而且也现aspriseOCR.dll 中的对话框(它是一个demo,让你买),但返回值却不对。根据这个对话框判断,应当是调用成功了(随DLL发布的DEMO,用C#写的,就有这个对话框,而且返回正确值),但为什么返回值不正确?即使我把返回值强制转换为文本。
动态调用的结果和第一种静态调用的结果相同,不出错,也没反应。
[解决办法]
Dll 最好不要使用 String 类型传递,使用 char * 比较好!
[解决办法]
VC 的CString与VCL的String(=AnsiString)是不一样的
[解决办法]
extern "C " __declspec(dllimport) void __stdcall OCR(String,int,char *);
我觉得这样写更安全
--但为什么不能把char* 放在 __stdcall 后面?
规定
就像virtrul void fun()不能写成 void virtrul fun()