在C++Builder中调用没有被宝兰封装的API怎么办?
我用Delphi调用NetShareAdd,添加网络共享的API(该函数没有被封装),可以正常执行,可再C++Builder中不能运行?我采用的动态调用“netapi32.dll"的方法,编译通过了可是,得不到正确的结果?请大虾指教 问题点数:100、回复次数:6Top
1 楼plainsong(短歌)()回复于 2002-05-25 13:25:21 得分 0
"我采用的动态调用“netapi32.dll"的方法,编译通过了可是,得不到正确的结果?"
把你的代码贴出来:
函数指针类型的声明;
DLL的装载;
函数指针的获得;
函数的调用.Top
2 楼plainsong(短歌)()回复于 2002-05-25 13:26:22 得分 0
你怎么一个问题贴了两个?快删除一个吧.Top
3 楼dingfuhai(loading)回复于 2002-05-26 01:06:38 得分 0
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Sysinit.hpp>
#include <FileCtrl.hpp>
#include <AccCtrl.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TLabel *Label1;
TButton *Button2;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
typedef struct _SHARE_INFO_502 {
LPTSTR shi502_netname;
DWORD shi502_type;
LPTSTR shi502_remark;
DWORD shi502_permissions;
DWORD shi502_max_uses;
DWORD shi502_current_uses;
LPTSTR shi502_path;
LPTSTR shi502_passwd;
DWORD shi502_reserved;
PSECURITY_DESCRIPTOR shi502_security_descriptor;
} SHARE_INFO_502, *PSHARE_INFO_502, *LPSHARE_INFO_502;
extern "C" __declspec(dllimport) unsigned int __stdcall NetShareAdd (LPTSTR servername, DWORD level, LPBYTE buf,
LPDWORD parm_err );
extern "C" __declspec(dllimport) unsigned int __stdcall NetShareDel ( LPTSTR servername,
LPTSTR netname,
DWORD reserved);
unsigned int NetShare(String ShareName, String ShareDir);
unsigned int UnNetShare(String ShareName);
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
unsigned int UnNetShare(String ShareName)
{
return NetShareDel(NULL,ShareName.c_str(),0);
}
unsigned int NetShare(String ShareName, String ShareDir)
{
SHARE_INFO_502 si;
char * ServerName;
ServerName = "";
si.shi502_netname = ShareName.c_str();
si.shi502_type = 0;
si.shi502_remark = NULL;
si.shi502_permissions = 0;
si.shi502_max_uses = -1;
si.shi502_current_uses = 10;
si.shi502_path = ShareDir.c_str() ;
si.shi502_passwd = NULL;
si.shi502_reserved = 0;
si.shi502_security_descriptor = NULL;
unsigned int r=0;
r=NetShareAdd(LPTSTR(ServerName),DWORD(502),LPBYTE(&si),0);
return r;
}
#endif
Top
4 楼plainsong(短歌)()回复于 2002-05-26 10:51:09 得分 0
上了你一大当:你明明用的是静态连接!
Top
5 楼plainsong(短歌)()回复于 2002-05-27 10:59:10 得分 100
这两个函数并非没有被BCB封装,你只要Einclude <lm.h>就行了.
在WIN NT和WIN 2K下,这两个函数中用到的所有字符串都是Unicode字符串.
我把你的代码改了一下,现在可以用了:
//NetShare.h:
unsigned int NetShare(WideString ShareName, WideString ShareDir);
unsigned int UnNetShare(WideString ShareName);
//NetShare.cpp:
#include <lm.h>
#include "NetShare.h"
unsigned int UnNetShare(WideString ShareName)
{
return NetShareDel(NULL,ShareName.c_bstr(),0);
}
unsigned int NetShare(WideString ShareName, WideString ShareDir)
{
DWORD Err;
SHARE_INFO_502 si;
LPWSTR ServerName;
ServerName = NULL;
si.shi502_netname = ShareName.c_bstr();
si.shi502_type = STYPE_DISKTREE; // disk drive
si.shi502_remark = NULL;
si.shi502_permissions = 0;
si.shi502_max_uses = -1;
si.shi502_current_uses = 10;
si.shi502_path =ShareDir.c_bstr();
si.shi502_passwd = NULL; // no password
si.shi502_reserved = 0;
si.shi502_security_descriptor = NULL;
unsigned int r=0;
r=NetShareAdd(ServerName,DWORD(2),LPBYTE(&si),&Err);
return r;
}
//调用:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
NetShare("TestE","E:\\DOC");0D
}
Top
6 楼dingfuhai(loading)回复于 2002-05-28 08:57:17 得分 0
我试试,怎么才知道API包含在那个头文件里,需要那个lib,dll?
对于这个函数我能不能用动态调用netapi32.dll,(用Loadlibrary)调用呢?Top
7 楼plainsong(短歌)()回复于 2002-05-28 17:20:41 得分 0
BCB的头文件一般和VC的头文件是一样的(C++标准库和Windows API的头文件是这样的).
在MSDN中,NetShareAdd的帮助的末尾写着呢.
在BCB的Windows SDK帮助的NetShareAdd帮助中也有,点击上面的Quick Info按扭...
?????????????
____ ____
\ p \ / g /
\ l \_/ n /
\ a o /
\ i s /
\ n /
\_/
Top




