我在VC中定义一个函数,生成DLL(API),函数内容如下
PackRecord ( char *s, ... )
{
va_list ap;
int t, x;
va_start ( ap, s );
while ( ( t = va_arg ( ap, int ) ) )
{
x = t;
}
va_end ( ap );
return 1;
}
生成DLL后为FileReadWrite.dll.拷贝到系统system32下,我在vb中调用,代码如下:
Private Declare Function PackRecord Lib "FileReadWrite" (strFile As String, ParamArray Items()) As Integer
Private Sub Form_Load()
Dim n As Integer
n = PackRecord("1.dat", 121, 2334, 5567)
End Sub
经调试,发现传到C中的参数全部不对。请指教。
PackRecord ( char *s, ... )
{
va_list ap;
int t, x;
va_start ( ap, s );
while ( ( t = va_arg ( ap, int ) ) )
{
x = t;
}
va_end ( ap );
return 1;
}
生成DLL后为FileReadWrite.dll.拷贝到系统system32下,我在vb中调用,代码如下:
Private Declare Function PackRecord Lib "FileReadWrite" (strFile As String, ParamArray Items()) As Integer
Private Sub Form_Load()
Dim n As Integer
n = PackRecord("1.dat", 121, 2334, 5567)
End Sub
经调试,发现传到C中的参数全部不对。请指教。
解决方案 »
- 人民币求购毕业设计
- 出现的未知错误,请大家指点下
- 我在VB上找不到Grid这个控件,谁能告诉我在哪里?
- 怎样判断一个ACCESS数据库中是否有一个指定的数据表?
- 一个简单的问题,很容易得分的,在线等待~~~~~~~~~
- tb.AddNew执行时为何提示“对象或者提供者不能执行所需的操作”??(代码在里面)
- 困饶两年的问题
- 在vb中插入记录到sql server 中的语句
- WORD问题
- 我有一个想做一个软件,和美萍网吧管理软件一样,最下面是一个任务栏,和win98一样,我想问怎样实现右边的托盘的输入法? 也就是用鼠标点一下我制作的输入法指示器,出现的和win98的那种差不多就行了!
- MSFlexGrid的一个问题。
- print and write 换行的问题,很急
至于可选参数在DLL中的调用。我也没接触过。
生命就是因为奋斗而变得美丽
人家散分,我就接 ...... 不懂的问题,我就进来学习,UP接分 ...... 知道一点的问题,我就给个意见,顺便UP接分 ...... 我懂的问题,那就赶紧回答,也就是进来抢分的 ......
BOOL ByVal variable As Long
BYTE ByVal variable As Byte
CHAR ByVal variable As Byte
COLORREF ByVal variable As Long
DWORD ByVal variable As Long
HWND,HDC,HMENU,... ByVal variable As Long
INT, UINT ByVal variable As Long
LONG ByVal variable As Long
LPARAM ByVal variable As Long
LPDWORD variable As Long
LPINT, LPUINT variable As Long
LPRECT variable As type
LPSTR, LPCSTR ByVal variable As String
LPVOID variable As Any
LPWORD variable As Integer
LRESULT ByVal variable As Long
NULL As Any
NULL ByVal variable As Long
SHORT ByVal variable As Integer
WORD ByVal variable As Integer
WPARAM ByVal variable As Long
Private Sub Form_Load()
Dim oAnyCall As New CVBAnyCall
Dim n As Long
oAnyCall.IsStandardCall = False
n = oAnyCall.CallApiByName("FileReadWrite.dll", "PackRecord", _
VarPtr(StrConv("1.dat", vbFromUnicode)), 1, 2, 3, 13, 0)
Debug.Print n
End Sub>>>>>>>VC中:
int PackRecord ( char*s , ...){
va_list ap;
int t, x;
va_start ( ap, s );
while ( ( t = va_arg ( ap, int ) ) )
{
x = t;
}
va_end ( ap );
return 1;
}
在这种情况下,是否在Dll中的函数PackRecord前加上__stdcall 修饰符并不重要,因为在编译的时候编译器并不知道实际参数的个数,所以在最后ret的时候也就不会恢复调用堆栈,也就是说擦pp的工作得靠调用者来做了,即按照__cdecl方式来调用你的函数……VBAnyCall类的代码与信息请看这里:
http://community.csdn.net/Expert/TopicView.asp?id=2980550
2 它的前面明确有ByVal;
3 它必是一维数组,且每个元素必是同一类型;
4 它声明之后就为可选参数,缺省值为每种类型的"Empty"值。
程序怎么知道你所要使用的文件“1.dat”的路径?
typedef struct _paramElem
{ char paramType ;
void *hParam;
int paramCb;
}paramElem;
PackRecord ( char *s,paramElem p[],int elemNum );或许这样可以,让个位见笑了.