dll文件如何生成符合vc调用约定的lib文件

bigwalnut 2010-03-23 01:23:07
买了一个Keyence的激光位移传感器,厂家只给了LkIF.h和LkIF.dll两个文件,没有给lib文件,现在我用dumpbin/exports LkIF.dll>lkif.def,产生了lkif.def文件,其代码如下:


Dump of file lkif.dll

File Type: DLL

Section contains the following exports for LkIF.dll

0 characteristics
424229D0 time date stamp Thu Mar 24 10:45:36 2005
0.00 version
1 ordinal base
138 number of functions
138 number of names

ordinal hint RVA name

1 0 00001334 LKIF_AbleCancel
2 1 0000105F LKIF_AbleStart
3 2 000010B4 LKIF_AbleStop
4 3 00001186 LKIF_ClearFigureData
5 4 0000138E LKIF_DataStorageGetData
6 5 0000127B LKIF_DataStorageGetStatus
7 6 00001208 LKIF_DataStorageInit
8 7 000011F9 LKIF_DataStorageStart
9 8 00001023 LKIF_DataStorageStop
10 9 00001299 LKIF_GetAbleMinMax
11 A 0000126C LKIF_GetAbleMode
12 B 00001190 LKIF_GetAlarmLevel
13 C 000011CC LKIF_GetAnalogScaling
14 D 00001127 LKIF_GetAnalogThrough
15 E 0000131B LKIF_GetAverage
16 F 0000101E LKIF_GetCalcData
17 10 000013F2 LKIF_GetCalcMethod
18 11 000012AD LKIF_GetCalcMode
19 12 00001258 LKIF_GetCutOffFrequency
20 13 000013AC LKIF_GetDataStorage
21 14 0000128A LKIF_GetDisplayUnit
22 15 00001406 LKIF_GetFigureData
23 16 00001014 LKIF_GetFilterMode
24 17 000010C8 LKIF_GetLight
25 18 00001131 LKIF_GetMeasureMode
26 19 00001311 LKIF_GetMutualInterferencePrevention
27 1A 00001037 LKIF_GetNumAlarm
28 1B 00001078 LKIF_GetOffset
29 1C 00001032 LKIF_GetPanel
30 1D 0000114A LKIF_GetProgramNo
31 1E 000011A9 LKIF_GetReflectionMode
32 1F 000010D7 LKIF_GetSamplingCycle
33 20 00001271 LKIF_GetScaling
34 21 0000128F LKIF_GetStorobeTime
35 22 00001069 LKIF_GetTimingSynchronization
36 23 00001140 LKIF_GetTolerance
37 24 000010F0 LKIF_GetToleranceComparatorOutputFormat
38 25 0000117C LKIF_GetTriggerMode
39 26 0000141A LKIF_SetAbleMinMax
40 27 0000132A LKIF_SetAbleMode
41 28 000010D2 LKIF_SetAlarmLevel
42 29 000012A3 LKIF_SetAnalogScaling
43 2A 000012F8 LKIF_SetAnalogThrough
44 2B 000011FE LKIF_SetAverage
45 2C 00001091 LKIF_SetCalcMethod
46 2D 000011AE LKIF_SetCalcMode
47 2E 000010A0 LKIF_SetCutOffFrequency
48 2F 0000135C LKIF_SetDataStorage
49 30 000010A5 LKIF_SetDisplayUnit
50 31 0000140B LKIF_SetFilterMode
51 32 000013BB LKIF_SetMeasureMode
52 33 000012DF LKIF_SetMode
53 34 00001352 LKIF_SetMutualInterferencePrevention
54 35 000010AA LKIF_SetNumAlarm
55 36 0000110E LKIF_SetOffset
56 37 00001401 LKIF_SetPanel
57 38 0000134D LKIF_SetPanelLock
58 39 00001195 LKIF_SetProgramNo
59 3A 0000133E LKIF_SetReflectionMode
60 3B 00001393 LKIF_SetReset
61 3C 00001087 LKIF_SetSamplingCycle
62 3D 00001339 LKIF_SetScaling
63 3E 00001113 LKIF_SetStorobeTime
64 3F 000010FF LKIF_SetTiming
65 40 00001384 LKIF_SetTimingSynchronization
66 41 000013D4 LKIF_SetTolerance
67 42 00001136 LKIF_SetToleranceComparatorOutputFormat
68 43 0000113B LKIF_SetTriggerMode
69 44 00001145 LKIF_SetZero
70 45 00001334 _LKIF_AbleCancel@0
71 46 0000105F _LKIF_AbleStart@4
72 47 000010B4 _LKIF_AbleStop@0
73 48 00001186 _LKIF_ClearFigureData@0
74 49 0000138E _LKIF_DataStorageGetData@16
75 4A 0000127B _LKIF_DataStorageGetStatus@12
76 4B 00001208 _LKIF_DataStorageInit@0
77 4C 000011F9 _LKIF_DataStorageStart@0
78 4D 00001023 _LKIF_DataStorageStop@0
79 4E 00001299 _LKIF_GetAbleMinMax@12
80 4F 0000126C _LKIF_GetAbleMode@8
81 50 00001190 _LKIF_GetAlarmLevel@8
82 51 000011CC _LKIF_GetAnalogScaling@20
83 52 00001127 _LKIF_GetAnalogThrough@8
84 53 0000131B _LKIF_GetAverage@8
85 54 0000101E _LKIF_GetCalcData@8
86 55 000013F2 _LKIF_GetCalcMethod@12
87 56 000012AD _LKIF_GetCalcMode@8
88 57 00001258 _LKIF_GetCutOffFrequency@8
89 58 000013AC _LKIF_GetDataStorage@12
90 59 0000128A _LKIF_GetDisplayUnit@8
91 5A 00001406 _LKIF_GetFigureData@8
92 5B 00001014 _LKIF_GetFilterMode@8
93 5C 000010C8 _LKIF_GetLight@20
94 5D 00001131 _LKIF_GetMeasureMode@8
95 5E 00001311 _LKIF_GetMutualInterferencePrevention@4
96 5F 00001037 _LKIF_GetNumAlarm@8
97 60 00001078 _LKIF_GetOffset@8
98 61 00001032 _LKIF_GetPanel@4
99 62 0000114A _LKIF_GetProgramNo@4
100 63 000011A9 _LKIF_GetReflectionMode@8
101 64 000010D7 _LKIF_GetSamplingCycle@4
102 65 00001271 _LKIF_GetScaling@24
103 66 0000128F _LKIF_GetStorobeTime@4
104 67 00001069 _LKIF_GetTimingSynchronization@4
105 68 00001140 _LKIF_GetTolerance@16
106 69 000010F0 _LKIF_GetToleranceComparatorOutputFormat@4
107 6A 0000117C _LKIF_GetTriggerMode@8
108 6B 0000141A _LKIF_SetAbleMinMax@12
109 6C 0000132A _LKIF_SetAbleMode@8
110 6D 000010D2 _LKIF_SetAlarmLevel@8
111 6E 000012A3 _LKIF_SetAnalogScaling@20
112 6F 000012F8 _LKIF_SetAnalogThrough@8
113 70 000011FE _LKIF_SetAverage@8
114 71 00001091 _LKIF_SetCalcMethod@12
115 72 000011AE _LKIF_SetCalcMode@8
116 73 000010A0 _LKIF_SetCutOffFrequency@8
117 74 0000135C _LKIF_SetDataStorage@12
118 75 000010A5 _LKIF_SetDisplayUnit@8
119 76 0000140B _LKIF_SetFilterMode@8
120 77 000013BB _LKIF_SetMeasureMode@8
121 78 000012DF _LKIF_SetMode@4
122 79 00001352 _LKIF_SetMutualInterferencePrevention@4
123 7A 000010AA _LKIF_SetNumAlarm@8
124 7B 0000110E _LKIF_SetOffset@8
125 7C 00001401 _LKIF_SetPanel@4
126 7D 0000134D _LKIF_SetPanelLock@4
127 7E 00001195 _LKIF_SetProgramNo@4
128 7F 0000133E _LKIF_SetReflectionMode@8
129 80 00001393 _LKIF_SetReset@4
130 81 00001087 _LKIF_SetSamplingCycle@4
131 82 00001339 _LKIF_SetScaling@24
132 83 00001113 _LKIF_SetStorobeTime@4
133 84 000010FF _LKIF_SetTiming@8
134 85 00001384 _LKIF_SetTimingSynchronization@4
135 86 000013D4 _LKIF_SetTolerance@16
136 87 00001136 _LKIF_SetToleranceComparatorOutputFormat@4
137 88 0000113B _LKIF_SetTriggerMode@8
138 89 00001145 _LKIF_SetZero@8

Summary

55000 .data
1000 .idata
5000 .rdata
3000 .reloc
1000 .rsrc
47000 .text


发现了如下问题:
里面的函数重复出现了,一个无下划线,一个带下划线

1 0 00001334 LKIF_AbleCancel
70 45 00001334 _LKIF_AbleCancel@0


我要用自己编写的VC程序(是VC不是Delphi),调用DLL的函数,我应该怎么修改这个ref文件使之符合vc调用约定呢,重复的函数要怎么处理?那位高手可以指点一下啊?


ps:lib/def:lkif.def>machine:ix86>out:lkif.lib 这个我是知道的
...全文
397 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuucyf 2011-02-23
  • 打赏
  • 举报
回复
LKIF_FLOATVALUE CalcData1, CalcData2;
if (Getdata(&CalcData1, &CalcData2))
{
//成功
}
else
{
//失败
}
wangyounihao 2011-02-23
  • 打赏
  • 举报
回复
留下QQ 41278515
wangyounihao 2011-02-23
  • 打赏
  • 举报
回复
我有LIB文件,赶快交流一下吧

bigwalnut 2010-03-23
  • 打赏
  • 举报
回复
根据楼上几位我写了如下代码:

void CDllTestDlg::OnGetdata()
{
// TODO: Add your control notification handler code here
HINSTANCE hinst;
hinst=LoadLibrary("lkif.dll");
typedef BOOL (WINAPI *ADDPROC)(OUT LKIF_FLOATVALUE *CalcData1,OUT LKIF_FLOATVALUE *CalcData2);
ADDPROC Getdata=(ADDPROC)GetProcAddress(hinst,"LKIF_GetCalcData");
if(!Getdata)
{
MessageBox("获取函数地址失败!");
}

//我的问题:下面要开始用DLL中的函数LKIF_GetCalcData(&CalcData1,&CalcData2)来采集端口out1的数据,我应该怎么使用BOOL WINAPI LKIF_GetCalcData(OUT LKIF_FLOATVALUE *CalcData1,OUT LKIF_FLOATVALUE *CalcData2);
这个函数呢?采用获得LKIF_FLOATVALUE中的Value的值;
}



该DLL函数的中文说明(日文翻译的,比较糙~)如下:

BOOL WINAPI LKIF_GetCalcData(OUT LKIF_FLOATVALUE *CalcData1,OUT LKIF_FLOATVALUE *CalcData2);
作用:取得测量值
参数
CalcData1:OUT1测量值。值设置为以下结构。
CalcData2 OUT2测量值。值设置为以下结构。
////////////////////////////////////////////////////
typedef enum {
  LKIF_FLOATRESULT_VALID, // 有效数据
  LKIF_FLOATRESULT_RANGEOVER_P, // +超过范围
  LKIF_FLOATRESULT_RANGEOVER_N, // -超过范围
  LKIF_FLOATRESULT_WAITING, // 轮候的决定
} LKIF_FLOATRESULT;

typedef struct {
  LKIF_FLOATRESULT FloatResult; // 是否有效数据
  float Value; // LKIF_FLOATRESULT_VALIDの時測定値。それ以外の場合は無効値。当LKIF_FLOATRESULT_VALID测量。否则是无效值。
} LKIF_FLOATVALUE;
////////////////////////////////////////////////////
返回值 TRUE 成功 FALSE 失败
价值LKIF_FLOATVALUE结构设置为值取决于身体的最小显示单元。
这不是鸭头 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jyh_baoding 的回复:]
花了金子,就让那走金子的负责
[/Quote]嗯
jyh_baoding 2010-03-23
  • 打赏
  • 举报
回复
花了金子,就让那走金子的负责
踏实每一步 2010-03-23
  • 打赏
  • 举报
回复
// A simple program that uses LoadLibrary and
// GetProcAddress to access myPuts from Myputs.dll.

#include <windows.h>
#include <stdio.h>

typedef int (__cdecl *MYPROC)(LPWSTR);

VOID main(VOID)
{
HINSTANCE hinstLib;
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;

// Get a handle to the DLL module.

hinstLib = LoadLibrary(TEXT("myputs"));

// If the handle is valid, try to get the function address.

if (hinstLib != NULL)
{
ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts");

// If the function address is valid, call the function.

if (NULL != ProcAdd)
{
fRunTimeLinkSuccess = TRUE;
(ProcAdd) (L"Message sent to the DLL function\n");
}

// Free the DLL module.

fFreeResult = FreeLibrary(hinstLib);
}

// If unable to call the DLL function, use an alternative.

if (! fRunTimeLinkSuccess)
printf("Message printed from executable\n");
}
webipstin 2010-03-23
  • 打赏
  • 举报
回复
LoadLirbrary

GetProcAddress(hInst,"LKIF_AbleCancel");



这个不行吗
bigwalnut 2010-03-23
  • 打赏
  • 举报
回复
额,经销商只有这两个文件

目前用vb Delphi可以实现调用,vc的调用还没有实现,牛人指点下~~~

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧