关于JAVA调用C++编写的DLL的问题 20C

最近刚开始接触java编程然后需要做一个语音合成,现在的情况是我使用C++直接调用SAPI后打包成DLL再去Java中调用,但是发现在C++中可以正常使用的Speak函数在Java中会读出乱码并且每次读的都不一样,初步怀疑是在C++中Speak函数的形参是LPSWSTR/LPCTSTR的宽字符型,而我Java中传入的参数是JAVA中的String型,不知道是不是这个问题,有什么解决方案吗,或者老哥们有什么想法?

4个回答

C++的dll那里,include jni.h,返回值定义成jstring,

用这个转换

 jstring charTojstring(JNIEnv* env, const char* str) {
    jstring rtn = 0;
    int slen = strlen(str);
    unsigned short * buffer = 0;
    if (slen == 0)
        rtn = (env)->NewStringUTF(str);
    else {
        int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR) str, slen, NULL, 0);
        buffer = (unsigned short *) malloc(length * 2 + 1);
        if (MultiByteToWideChar( CP_ACP, 0, (LPCSTR) str, slen, (LPWSTR) buffer, length) > 0)
            rtn = (env)->NewString((jchar*) buffer, length);
        // 释放内存
        free(buffer);
    }
    return rtn;
}

https://blog.csdn.net/xlxxcc/article/details/51106721

caozhy
贵阳老马马善福专门编写代码的老马就是我! const char* str修改下const wchar_t
大约一年之前 回复
sinat_39336333
星辰驰骋的终幕蔷薇 "char是8位,ANSI编码,wchar_t是16位或32位,根据C或C++库而定,是Unicode编码"------我用的是JNA的jar包而且问题就出在 在C++中LPCWSTR貌似是不可以通过输入的方式去赋值的宽字符型,是wchar_t的类型定义,并不是char。。。
大约一年之前 回复

老兄,一般宽窄字符需要有个转换的,c++里面是MultiByteToWideChar,不知你java里面有没有类似函数,转一下再传过去呗

//把宽字符串转换成字符串,输出使用

string wstring2string(wstring sToMatch)

{

#ifdef _A_WIN

string sResult;

int iLen = WideCharToMultiByte( CP_ACP, NULL, sToMatch.c_str(), -1, NULL, 0, NULL, FALSE ); // 计算转换后字符串的长度。(包含字符串结束符)

char *lpsz = new char[iLen];

WideCharToMultiByte( CP_OEMCP, NULL, sToMatch.c_str(), -1, lpsz, iLen, NULL, FALSE); // 正式转换。

sResult.assign( lpsz, iLen - 1 ); // 对string对象进行赋值。

delete []lpsz;

#elif _A_LINUX

int iLen = wcstombs( NULL, sToMatch.c_str(), 0 ); // 计算转换后字符串的长度。(不包含字符串结束符)

char *lpsz = new char[iLen + 1];

int i = wcstombs( lpsz, sToMatch.c_str(), iLen ); // 转换。(没有结束符)

lpsz[iLen] = '/0';

string sResult(lpsz);

delete []lpsz;

#endif

return sResult;

}

直接都搞成字节来处理吧

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java调用c编写的dll库的问题?
我手上有个dll库和.h文件rn现在的问题是库里面的函数名和我用javah反编译java的类文件得到的函数名不一样rn例如:java文件里面有public native int construct();rnjavah后变成... Java_JavaCop_construct(...);rn而我有的那个dll的头文件里面是Java_JavaCop_construct_stub(...);rn比我的版本的javah得到的函数多了个_stub,这样导致我运行程序调用dllrn里面的函数时,抛出的例外如下:rnjava.lang.UnsatisfiedLinkError:...rnrn请问大侠,这个问题如何解决,是不是它当时的javah和我的版本的javah不兼容的rn问题导致的,那么这样看,它原来的javah的版本是jdk的那个版本?rn多谢!!!急!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1rnrn 如何定义java里面的函数,才能用javah调用时产生和dll中一致的函数名呢?rn 就比如那个construct(...);rn 怎么改名字才能出现...construct_stub(...); ???rnrn 简单的变成construct_stub是不可以的,javah后变成...construct_1stubrn
C编写dll及调用
C编写dll及调用C编写dll及调用C编写dll及调用
关于Dll的编写和调用问题
DLLrnDllTest.hrn[code=C/C++]rnrn#ifndef LIB_Hrn#define LIB_Hrnextern "C" int add(int x,int y);rn#endifrn[/code]rnrnDllTest.cpprn[code=C/C++]rn#include "DllTest.h"rnint add(int x, int y)rnrnreturn x + y;rnrn[/code]rnrn[code=C/C++]rn#include rn#pragma comment(lib,"DllTest.lib")rnextern "C" __declspec(dllimport) add(int x,int y);rnint main()rnrn int result = add(2,3);rn printf("%d",result);rn return 0;rnrn[/code]rnrn出现的错误:rnrnDllTest.lib : warning LNK4003: invalid library format; library ignoredrnDllTest.lib : warning LNK4003: invalid library format; library ignoredrntest.obj : error LNK2001: unresolved external symbol __imp__addrnDebug/test.exe : fatal error LNK1120: 1 unresolved externals
关于DLL的编写与调用
我写的读网卡MAC地址的DLL:rnrnlibrary Project1;rnrn Important note about DLL memory management: ShareMem must be thern first unit in your library's USES clause AND your project's (selectrn Project-View Source) USES clause if your DLL exports any procedures orrn functions that pass strings as parameters or function results. Thisrn applies to all strings passed to and from your DLL--even those thatrn are nested in records and classes. ShareMem is the interface unit torn the BORLNDMM.DLL shared memory manager, which must be deployed alongrn with your DLL. To avoid using BORLNDMM.DLL, pass string informationrn using PChar or ShortString parameters. rnrn usesrn Windows , SysUtils , NB30;rnrnfunction NBGetAdapterAddress: string;rnvarrn NCB: TNCB; // Netbios control block //NetBios控制块rn ADAPTER: TADAPTERSTATUS; // Netbios adapter status//取网卡状态rn LANAENUM: TLANAENUM; // Netbios lanarn intIdx: Integer; // Temporary work value//临时变量rn cRC: Char; // Netbios return code//NetBios返回值rn strTemp: string; // Temporary string//临时变量rnbeginrn Result := '';rnrn tryrn ZeroMemory(@NCB, SizeOf(NCB)); // Zero control bloclrnrn NCB.ncb_command := Chr(NCBENUM); // Issue enum commandrn cRC := NetBios(@NCB);rnrn NCB.ncb_buffer := @LANAENUM; // Reissue enum commandrn NCB.ncb_length := SizeOf(LANAENUM);rn cRC := NetBios(@NCB);rn if Ord(cRC) <> 0 thenrn exit;rnrn ZeroMemory(@NCB, SizeOf(NCB)); // Reset adapterrn NCB.ncb_command := Chr(NCBRESET);rn NCB.ncb_lana_num := LANAENUM.lana[0];rn cRC := NetBios(@NCB);rn if Ord(cRC) <> 0 thenrn exit;rnrnrn ZeroMemory(@NCB, SizeOf(NCB)); // Get adapter addressrn NCB.ncb_command := Chr(NCBASTAT);rn NCB.ncb_lana_num := LANAENUM.lana[0];rn StrPCopy(NCB.ncb_callname, '*');rn NCB.ncb_buffer := @ADAPTER;rn NCB.ncb_length := SizeOf(ADAPTER);rn cRC := NetBios(@NCB);rnrn strTemp := ''; // Convert it to stringrn for intIdx := 0 to 5 dorn strTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address[intIdx]), 2);rn Result := strTemp;rn finallyrn end;rnend;rnrnexports NBGetAdapterAddress;rn$R *.resrnrnbeginrnend.rnrn调用程序:rnunit Unit1;rnrninterfacernrnusesrn Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,rn Dialogs, StdCtrls, NB30;rnrntypern TForm1 = class(TForm)rn Edit1: TEdit;rn Button1: TButton;rn Edit2: TEdit;rn Button2: TButton;rn procedure Button2Click(Sender: TObject);rn privatern Private declarations rn publicrn Public declarations rn end;rnrnvarrn Form1: TForm1;rn function NBGetAdapterAddress: string;rn external 'Project1.dll';rnimplementationrnrn$R *.dfmrnrnprocedure TForm1.Button2Click(Sender: TObject);rnbeginrn ShowMessage(NBGetAdapterAddress);rnend;rnrnend.rnrn调用后,网卡的MAC地址是读出来了,可是出错,显示"Invalid pointer operation"rn在VC VB中调用提示内存读错!没有办法显示传回来的数!
关于C编写的DLL在delphi调用?
现有一个动态链接库BANK.DLL,其中有函数:rnint Comm(char *server, int port, char *reqbuf, int reqlen, char **ansbuf, int *anslen);rn我需要在DELPHI中调用它,如下书写是否正确?rnfunction Comm(server:pchar;port:integer;reqbuf:pchar;reqlen:integer;ansbuf:pchar;anslen:pinteger):integer;stdcall;external 'bank.dll' name 'Comm';rn 我最担心的是char **ansbuf 在DELPHI中对应什么数据类型rnrn 谢谢!
关于delphi调用c\c++编写的dll
关于delphi调用c\c++编写的dll,有没有问题?能够顺利调用成功的话,能不能给出一个如何在delphi中引用这种动态连接库的实例?
C#调用C编写dll
[DllImport("P230_DLL_VC.DLL")]rnpublic static unsafe extern int RpcClose();rnrn调用 int a=RpcClose();rn出错:无法在 DLL P230_DLL_VC.DLL 中找到名为 RpcClose 的入口点。rn请教一下如何解决。rn谢谢!
JNA调用C编写的DLL
我们团队目前开发的产品是用java语言编写的,大家都知道,java编写的代码随便都可以被反编译,导致别人可能会看到你“裸奔”的样子。所以,为了避免这种安全隐患,团队最终商定,将部分核心代码改用c语言编写,封装为dll,再由java调用。 于是乎,我们就开始jna初探。今天通过各种百度,终于做了个例子出来,在此做个记录,以备后路之需。 1、构造一个dll 由于本机的vs2015没有安装c++模...
C语言Dll编写与调用
C语言Dll编写与调用,内含源代码与操作步骤
求救,C# 调用C编写的dll问题
C原型:rntypedef enum _SUPPORT_LAYERrn rn HDLC = 0x01,rn TCPIP,rn UDPIPrn SUPPORT_LAYER;rn rn typedef union _ADDRrnrn structrn rn unsigned int ServerLowerAddr : 14; //服务器低地址rn unsigned int ServerUpperAddr : 14; //服务器高地址rn unsigned int res : 4;rn unsigned char ClientAddr;rn unsigned char ServerAddrLen;rn HDLC_ADDR1;rnrn structrn rn unsigned int ServerAddr : 28;rn unsigned int res : 4;rn unsigned char ClientAddr;rn unsigned char ServerAddrLen;rn HDLC_ADDR2;rnrn structrn rn unsigned int Client_TCP_Port;rn unsigned int Server_TCP_Port;rn unsigned char Client_IP_Addr[4];rn unsigned char Server_IP_Addr[4];rn TCPIP_ADDR;rnrn structrn rn unsigned int Client_wPort;rn unsigned int Server_wPort;rn unsigned int Client_UDP_Port;rn unsigned int Server_UDP_Port;rn unsigned char Client_IP_Addr[4];rn unsigned char Server_IP_Addr[4];rn UDPIP_ADDR; rnADDR;rnrn int ProcessServicePrimitive(unsigned char **OUTData, unsigned int &OUTDataLen,SUPPORT_LAYER SupportLayerType, ADDR Addr,const unsigned char *Xml, unsigned int XmlLen);rn请问如何用C#调用ProcessServicePrimitive参数?
c#调用c编写的dll问题,char*
最近在弄一个rfid读卡的测试模块。需要调用c/c++编写的dll。但是一直弄不对,请大侠帮忙rnrndll函数原型rn函数声明 int WINAPI mifs_request_2(uchar _Mode, uchar *_TagType)rn功能描述 寻卡rn入口参数 _ Mode:模式 0x26 rn出口参数 TagType:卡类型rn返 回 值 0—成功,﹥0—失败rnrnrnc#的代码rn函数定义rn [DllImport("MifsDLL.dll", CharSet = CharSet.Ansi)]rn private static extern int mifs_request_2(rn byte bMode,rn StringBuilder strbCardTypern );rn函数调用rn int iRet;rn StringBuilder strbCardType = new StringBuilder(255);rn iRet = -1;rn for (int i = 0; i < PublicVar.iGL_RetryTimes; i++)rn rn iRet = mifs_request_2(0x26, strbCardType);rn MessageBox.Show(strbCardType.ToString());rn if(iRet == 0)rn break;rn rnshow出来的是乱码,不知道为什么
关于java调用dll的问题
如果java程序部署在windows环境的话,这个是很好实现的。但现在需要部署在unix环境下,且还需要调用dll,请问各位高手有何好办法吗?
关于java调用dll问题
我用java调用已有的dll总是提示rnException in thread "main" java.lang.UnsatisfiedLinkError: piut_setservernodern at com.testdll.Piapi32.piut_setservernode(Native Method)rn at com.testdll.Piapi32.main(Piapi32.java:19)rn错误。rn源程序:rnpackage com.testdll;rnrnpublic class Piapi32 rn public static native int piut_setservernode(String a);rn public static native int piut_login(String user,String pwd,int i);rn public static native int pipt_findpoint(String b,int pt);rn public static native int pisn_getsnapshots(int pt,float rval,int istat,int timedate,int error,int count);rn public static void main(String[] args)rn System.loadLibrary("piapi32");rn int x = Piapi32.piut_setservernode("piserver");rn System.out.println(x);rn什么原因导致找不到这个方法?
求教:关于DLL的编写和调用
最近和同学用VC和VB混合编一个东东(软件课的作业),我们决定用VC把我的模块编成DLL给VB调用。我在学习编写DLL时遇到了如下问题:rn1. 在VC里写了这样一个函数用_declspec(dllexport)导出:rnvoid _declspec(dllexport) SayYesSir(void)rnrn AfxMessageBox("Yes, Sir!");rnrn在VC里用隐式链接可以调用,但是在用显式调用时:rntypedef void (*FUNCTION)(void);rnHINSTANCE hDLL = NULL;rnrnvoid CMy2Dlg::OnYessir() rnrn hDLL = LoadLibrary("dll.dll");rnrn if(hDLL == NULL)rn rn AfxMessageBox("DLL have not been loaded!");rn return;rn rnrn FUNCTION SayYesSir = NULL;rn SayYesSir = (FUNCTION)GetProcAddress(hDLL, "SayYesSir");rn if(SayYesSir == NULL)rn rn AfxMessageBox("Error");rn return;rn rn SayYesSir();rnrn出错。用dumpbin检查发现导出函数SayYesSir的函数名变成了"?SayYesSir@@YAXXZ",将它代到上面就可以使用。为什么?是因为用__declspec(dllexport)导出的原因吗(好像用.def文件导出就没这个问题)?对于用__declspec(dllexport)导出的函数/类/……,正确的调用方法是怎样的?——总不能每次写DLL都要用dumpbin去看看导出函数名变成什么样子了吧。rnrn2. VB调用DLL时可以使用DLL里定义的类吗?如果可以,how?rnrn3. 我想让我的DLL可以与其它模块互相传送数据,请问接收数据时可以是其它模块(用VB编写)运行时的一块数据的指针/引用吗?如果可以,how?rnrn第一位能回答以上三个中任一问题者,100分奉送。但请勿谈论无关内容!rn另:我是第一次题问,请顺便告诉我怎么给分(应该可以一下子给300分的吧^-^)。谢谢了先~~rn
c#调用java编写的dll的问题
有下面这样的文档说明,想问一下,使用C#来开发,该怎样创建这个接口实例及释放这个接口实例呢?rn文档中提到每种开发语言都有自己调用COM组件的方式。那么C#该是怎样的呢?下文中提到的a.dll是java开发的。rnrn一、接口概述rn本接口系统一共包含三个文件,分别为a.dll、b.exe、c.pbd。rn所有服务均集成在动态链接库a.dll中,这个dll文件需要注册成com组件。rnb.exe和c.pbd文件,用于接口升级。rn以上三个文件必须在同一个目录中。rn调用系统只需要调用Program ID为a的组件中的服务就可以了。rnrn下面将讲述接口的具体使用方法及例程。rn(注:本文提供的PB示例代码,作用是更直观的解释本方案内容,以方便所有厂商进行开发,仅供参考之用。)rn二、接口环境rn在业务机上需要具备接口环境,具体操作如下:rn1、 将【接口库dll】文件夹中所有的dll文件拷入C:\WINDOWS\system32下。rn2、 注册a.dll文件,a.dll为接口的类库文件,具体注册方法如下(其它dll无须注册):rn3、 a.dll注册方法:rn点击 开始 -> 运行 ->输入 regsvr32 a.dll 回车rn如果显示 “a.dll 中的DLLRegisterServer” 成功字样,说明注册成功。rnrn三、接口实例创建、接口示例回收rn在登陆调用系统时需要进行接口实例的创建,创建成功以后,才能正常调用接口服务。rn建议在调用系统登陆的同时,调用接口登陆的服务,同时在退出调用系统时,需要进行接口实例的回收,以免造成资源浪费。rn1、接口实例的创建,创建ole对象rn通过第二步操作,接口dll(a.dll)已经被注册成了COM组件。每种开发语言都有自己调用COM组件的方式。开发人员可以根据自己所使用的开发语言来调用本接口的COM组件,创建接口对象的实例。本接口的Program id为:a,Class id为: E434ECF4-CB87-446B-8497-B792A2BF213D。rnrnPB示例,各种开发语言方法不同,下面代码仅供PB程序员参考:rn//创建嵌入式接口对象,调用com组件rnint virnOleobject X rnX =create Oleobject //创建ole对象proxyrnvi= X.connecttonewobject('a') //连接com组件rnif vi <> 0 thenrn messagebox('错误','创建嵌入式接口a对象失败!')rn return rnend ifrnrn2、接口实例的回收:rn在不使用本接口的时候,需要回收接口实例,以免造成资源浪费。rnPB示例,各种开发语言方法不同,下面代码仅供PB程序员参考::rn//销毁嵌入式接口对象rnX.DisconnectObject() // DisconnectObject方法为PB语言的系统函数rnDestroy Xrn
c#调用c编写的dll 关于指针问题
dll.h文件[code=c]#include rnrnstruct str_dllrnrn int age;rn char par_char3[ 256 ]; rn;rnrnstruct dll_testrn rn char par_char1[ 256 ]; rn char par_char2[ 256 ]; rn int* ptr_int;rn float par_float;rn void* Ptr_void;rn str_dll struct_str_dll;rn;rnrnextern "C" __declspec(dllexport)rn int __cdecl change_str_dll(str_dll test_str_dll);rnrnextern "C" __declspec(dllexport)rn int __cdecl foo(int ret);rnrnextern "C" __declspec(dllexport)rnint change_dll_test(dll_test* ptr_dll_test);[/code]rndll.cpp文件[code=c]#include "test_cpp.h"rnrnint change_str_dll(str_dll test_str_dll)rnrn test_str_dll.age = 10;rn return 0;rnrnrnint foo(int ret)rnrn return (ret+1);rnrn rnrn//int change_dll_test(char* buffer1, char* buffer2, double* ptr_double, float par_float, void* Ptr_void)rnint change_dll_test(dll_test* ptr_dll_test)rnrn strncpy(ptr_dll_test->par_char1, "test buffer1...", 256);rn strncpy(ptr_dll_test->par_char2, "test buffer2...", 256);rn int* i;rn int j = 99;rn i = &j;rn ptr_dll_test->ptr_int = i;rn ptr_dll_test->par_float = 12;rn ptr_dll_test->Ptr_void = i;rn ptr_dll_test->struct_str_dll.age = 24;rn strncpy(ptr_dll_test->struct_str_dll.par_char3, "test struct is over!", 256);rnrn return 0;rn[/code]rnc#调用文件如下显示:rn[code=csharp]rn[DllImport("TEST_DLL.dll", CallingConvention = CallingConvention.Cdecl)]rnprivate static extern int change_dll_test(ref dll_test ptr_dll_test);rndll_test ptr_dll_test = new dll_test();rnint i = change_dll_test(ref ptr_dll_test);[/code]得到的int* ptr_int;void* Ptr_void,是个地址,在c#中如何得到对应的值,具体代码该怎么写 或者说一下方向我自己查
关于在vc中调用c语言编写的dll文件的问题。
关于在vc中调用c语言编写的dll文件的问题。rn 我现在有一个例程,他是vc编写的(c++),其中要调用几个函数,rn而这几个函数在一个dll文件中,我现在把这个dll文件放在系统目录rn或程序的目录下,但执行程序时,依然会提示我调用dll文件没有成功。rn(注意:例程只给我dll文件,并没有给我相应的lib文件,而程序中rn也未出现什么调用dll文件的语句。整个程序中没有出现dll文件的名字!)rn 请问这个例程有可能哪里出了问题?
关于vb调用c编写的dll文件的回调函数的问题!
vb调用c编写的dll文件,下面是关于函数的说明,请问一下在VB中怎么写? rnrnBOOL Hik_PlayM4_SetSourceBufCallBack(LONG nPort,DWORD nThreShold,void (CALLBACK *SourceBufCallBack)rn (long nPort,DWORD nBufSize,DWORD dwUser,void*pResvered),DWORD dwUser,void *pReserved);rn说 明: 设置源缓冲区阀值和剩余数据小于等于阀值时的回调函数指针.rn输入参数:rn nThreShold 阀值.rn SourceBufCallBack 回调函数指针;rn dwUser 用户数据;rn pReserved 保留数据;rnrn回调函数声明:rn void CALLBACK SourceBufCallBack(long nPort,DWORD nBufSize, DWORD dwUser,void*pContext)rn参 数:rn nPort 播放器通道号.rn nBufSize 缓冲区中剩余数据;rn dwUser 用户数据;rn pResvered 保留数据;rn
关于Delphi DLL动态连接库编写与调用的问题
小弟学D有段时间了,虽然说现在能写一些简单的程序但是对DLL还是很陌生.看了许多关于DLL的文章对其有了一点初步的了解.但是编写与调用还是很模糊.rnrn我的问题如下.rnrn例如说我现在想写一个简单的加密算法的DLL.可是怎么编写怎么掉用就很模糊了.rnrn加秘算法:rnrnprocedure TMain.SpeedButton1Click(Sender: TObject);rnvarrn s1, s2, s3: string;rn j: integer;rnbeginrn if jm1 <> '' thenrn beginrn s1 := jm1;rn for j := 1 to length(s1) dorn s1[j] := chr(ord(s1[j]) xor 255);rn SetLength(s2, Length(s1) * 2);rn BinToHex(PChar(s1), PChar(s2), Length(s1));rn s3 := s2;rn for j := 1 to length(s3) dorn s3[j] := chr(ord(s3[j]) + 211);rn jm := s3;rn end;rnend;rnrnrn解密算法:rnrnprocedure TMain.SpeedButton2Click(Sender: TObject);rnvarrn s1, s2, s3: string;rn j: integer;rnbeginrn if qm1 <> '' thenrn beginrn s3 := qm1;rn for j := 1 to length(s3) dorn s3[j] := chr(ord(s3[j]) - 211);rn s1 := s3;rn SetLength(s2, Length(s1) div 2);rn HexToBin(PChar(s1), PChar(s2), Length(s1));rn for j := 1 to length(s2) dorn s2[j] := chr(ord(s2[j]) xor 255);rn qm := s2;rn end;rnend;rnrnrn这是两个过程,我想写在一个DLL里,让程序能够掉用.但是怎么写怎么掉用我很模糊rn意思就是说我想让程序的一个变量得到一个值后执行一次DLL的加秘算法然后把结果附给另外一个程序变量rn需要解密的时候把这个加好密的变量再附给另外一个程序变量执行一次DLL的解密算法结果给程序的一个变量rnrn程序变量 a:= '111' 然后让DLL的加密算法把'111'进行加密结果附给程序变量 b:= 'DLL加密结果' rnrn程序变量 c:= '加密后的结果' 执行一次DLL的解密算法,把解密后的结果附给程序变量 d:= 'DLL解密结果'rnrn现在的问题就是怎么在DLL里写这两个加密与解密算法.然后怎么让程序调用加密与解密.rnrnrn各位大哥大姐,帮帮小弟.对DLL还是很模糊.呵呵感谢大家的帮助
关于VB6编写的.dll文件调用的问题
我在VB6中先建立的一个Activex Dll工程文档并编绎成为相应的Sample.dll文件。在这个文件中比如有如下一个函数rnpublic Function myFun1(i As Integer) AS IntegerrnDim k as integerrnk=5rnmyFun1=k*2rnend Functionrn我在另一个工程中声明如下(模块级)rnprivate Declare Function myFun1 Lib "路径...\Sample.dll" (Byval i As Integer) AS Integerrn在一个过程中调用动态函数myFun1时,编绎总是说:“找不到dll的入口点myFun1 在.........”rn恳请高手指点迷津!!! (最好给一个小示例),万分感激.
关于Delphi调用vc编写的 dll的问题???
vc的dllrnextern "C" __declspec (dllexport) int IsConnEx(UCHAR *idata,UCHAR *odata)rnrnrnrn在Delphi这样引用rnfunction IsConnEx(idata: pointer; odata: pointer):integer; stdcall external 'PcConn.dll'rnrnret:=IsConnEx(@idata,@odata); rnrn运行上面这句调用后,我在dll并没有改变idata值,但返回时,idata值却变了,而且函数结束时还出现异常?rnrn如果在vc的dll中,这样改rnextern "C" __declspec (dllexport) int __stdcall IsConnEx(UCHAR *idata,UCHAR *odata)rn提示无法定位程序输入点。rnrn请大家帮忙,怎么才能调用成功?rn另,如果可能的话,我只想修改dll中的代码,不想修改delphi代码。rn
关于调用其它软件编写的dll的问题
调用很顺利,可是当我用新版的dll替换旧版的时候总是报错说正在使用中。。。rn我把iis停止了也不行。。rnrnrn有什么好办法?
关于VB调用VC++编写的DLL的问题
我在VC++编写的DLL中定义:rndefine PORT32API _declspec(dllexport)rnPORT32API long getdiskid ()rnrn long id = getHardDriveComputerID ();rnrn return id;rnrn在VC++中调用这个DLL没有问题,在VB6.0中定义:rnPublic Declare Function getdiskid Lib "aa.dll" () As Longrn编译没问题,但在运行时出错,显示:getdiskid 在aa.dll中找不到入口...rnwhy???
关于Delphi调用VC编写的DLL问题?
我初学VC,用VC的 MFC APPWizard(DLL)创建了一个DLL,里有两个导出函数,然后在Delphi里调用,ShowHello没有参数,可以;ShowHello2有一个Pchar参数,为什么执行后总是弹出一个错误窗口。rnrn源码如下:rnrnVC:rn// my.h : main header file for the my DLLrnrnclass CmyApp : public CWinApprnrn ......rn;rnrnextern "C" __declspec(dllexport) BOOL ShowHello(void);rnextern "C" __declspec(dllexport) BOOL ShowHello2(const char * aName);rnrnrn//my.cpp:--------------------------------------rn .......rnrnextern "C" __declspec(dllexport) BOOL ShowHello(void)rnrn AFX_MANAGE_STATE(AfxGetStaticModuleState());rnrn AfxMessageBox("Hello, Vc 6.0.");rn return true;rnrnrnextern "C" __declspec(dllexport) BOOL ShowHello2(const char * aName)rnrn AFX_MANAGE_STATE(AfxGetStaticModuleState());rnrn AfxMessageBox("Hello, Vc 6.0.");rn return true;rnrnrnrnDelphi **************************************************rn声明:rn function ShowHello2(aName:PChar):boolean;stdcall;external 'my.dll' name 'ShowHello2';rn function ShowHello():boolean;stdcall;external 'my.dll'name 'ShowHello';rnrn调用:rnvarrn aName:PChar;rnbeginrn aName := StrAlloc(64);rn StrPCopy(aName,'Mike');rn ShowHello2(aName); //可以弹出对话框"Hello, Vc 6.0.",接着就出错了 Access violation at addres 00E8723B.Write of address 2C01B51Crn StrDispose(aName);rnend;rnrnrn为什么 VC 中带了参数就会出错,换成其他参数也是。请各位帮忙看看哪里出了问题了?多谢了。rn
关于C# 编写dll,vb6调用的问题
我用c#编写了dll(.tlb) 然后用vb6引用此.tlb 编写程序:rn首先 在用vb6引用此tlb 对象编写程序时,对象没有帮助信息(例如使用.号以后不能出现此对象的可用方法信息),但编译无误和程序运行正常rn但把此vb程序打包在别的机器上安装运行时 提示 'Active X' 部件出错rnrn.net 环境已经装好
关于C#调用c++编写的DLL问题
rn我用C++编写了一个Player Information Database 以及相应的接口函数用于从外部操作数据库,我想要动态调用 .dll文件中的所有函数rnrn我就拿其中几个函数做例子:rn在Dll中rn[code=C/C++]rn#ifdef DB_EXPORTSrn#define DB_API __declspec(dllexport)rn#elsern#define DB_API __declspec(dllimport)rn#endifrn extern "C"rn rn DB_API void DB_Init(void **DB);rn DB_API void DBDisplay(void *DB);rn rn //用于初始化数据库rn void DB_Init(void **DB)rn rn CPlayerDatabase *myDB = new CPlayerDatabase();rn myDB->init();rn *DB = myDB;rn rn //用于打印数据库rn void DBDisplay(void *DB)rn rn ((CPlayerDatabase*)DB)->Display();rn rn[/code]rn在C# 定义的接口类中,大家帮我看看我导入DLL的方法正确吗? rn[code=C#]rnclass PlayerDataBase_APIrnrn //因为这里是指针的指针,我觉得我的定义是错的rn [DllImport("CPlayerDataBaseDll.dll"), EntryPoint = "DB_Init"]rn public static extern void DB_Init(out IntPtr DB);rn [DllImport("CPlayerDataBaseDll.dll"), EntryPoint = "DBDisplay"]rn public static extern void DBDisplay(IntPtr DB);rnrnrn[/code]rnrn在主函数中:rn我用到了rnIntPtr cpdb = Marshal.AllocHGlobal(0);rnPlayerDatabase_API.DB_Init(out cpdb);rnPlayerDatabase_API.DBDisplay(cpdb);rn结果报错了。。。rnrn因为我会用到很多DLL的函数,他们可以共用这个IntPtr cpdb 吗?如果是该怎么做? 还是像c++中对每个函数都要进行Load, GetProcAddress,Free.rn这是我现在正在学的跨平台调用DLL,所以我还有很多问题,希望大家给我提点意见,谢谢各位。
关于:vb 调用delphi编写的dll 问题
1、调用时,提示文件没找到?rn2、比如我调用ICRW.DLL文件,我如何查出它需要哪些参数?rnrn
关于C#调用C++编写的DLL问题
最近因为需要,想用C#调用DLL开发一个软件,开发文档只有接口描述rn初始化(Std_Initialize)rn函数原型: rnextern ”c” _declspec(dllexport) rnLong __stdcall Std_Initialize(viod)rn参数说明:rn 无rn返回值:rn返回值 代表含义rn>=0 调用成功rn-1 调用失败rn-98 输入参数非法rn-99 其它错误rnrn我直接引用DLL报错,使用rn [DllImport("StdClient.dll")]rn public static extern System.Int32 Std_Initialize();rn可以编译,但是EXE运行一开始初始化就报错,显示:无法加载DLL,找不到指定的模块。rnrn第一次做这方面开发,没有经验,网上找了几天资料,没有任何头绪,只能求教各位大虾帮忙。
关于PB调用BCB编写的DLL问题
在PB下调用BCB编写的DLL,要求传递的参数是char *型,返回值要求是字符串,但是BCB下的AnsiString在PB下不支持,需要将返回值设成char *型,但是这样一来在BCB下却无法调试通过。请问这个问题怎么解决?
请教:关于调用Vc编写的Dll问题
使用C#调用vc编写的DLL里的函数时遇到了如下问题:rnDll里的函数: int fun(byte* in, byte* out),其中in是C#输入的函数,rnout是fun函数要改写的数组rnrn在C#程序里如下导入:rn【dllimport 。。。】rn。。。 int fun(byte[] in, byte[] out);rnrn然后如下调用:rn假设in已经定义,rnbyte[] out = new byte[256];rnint iRet = fun(in,out);rnrnfun执行后,iRet的值正确,但是out却没有被改写,而且其长度变成0。这是为什么啊?按说out数组的元素值在fun里被改变了啊。怎么长度为0了呢。rn请各位大虾指教。rnrn
关于调用vc 编写的 dll的问题???
bool ByteToString(unsigned char *ucBuf, int nLen, char *chBuf) // vc函数rnrnfunction ByteToString(ucBuf : PByte; nLen : Integer; chBuf : PChar) : Boolean; External 'TestDelphi.dll'; // delphi函数声明, 不过里面的类型我不确定是否正确rnrn// 调用部分rnprocedure TForm1.BitBtn1Click(Sender: TObject);rnvarrn ucTestBuf : array[0..8] of byte;rn chTestBuf : array[0..16] of char;rnbeginrnrn ByteToString(ucTestBuf, 8, chTestBuf); // 这里编译不通过, 类型不匹配rnrnend;rnrnend.rnrn请问该怎么正确声明, 怎样把数组里的内容正确的传给dll?
关于Java调用.dll???
请问Java能不能调用其他语言编译的.dll?rn比如用Java调用LabWindows/CVI生成的DLL.
关于vs2008使用c编写dll的问题
想使用/TC的方式去编译,但头文件中rn#define TESTDLL extern "C" __declspec(dllexport) rnTESTDLL void sayHello();rnrn在第二行显示,drror C2059;syntax error : 'string'rnrn请问各位,不可以用/tc方式编写c的dll么?rnrnrnrn
调用C的Dll的问题
这是dll中的C语言代码rntypedef structrnrnlong readertype;rnlong cardtype;rnlong port;rnlong baud;rnhandle commdevice;rnlong timeout;rnchar *pin;rnchar *key;rnchar *hostaddr;rnlong hosttimeout;rnchar *cardsn;rnlong optype;rnchar reserved[32];rnicc_env;rnrntypedef structrnrnunsigned char *pin;rnunsigned char *idcard;rnunsigned char *name;rnunsigned char *sex;rnunsigned char *birth;rnunsigned char *workdate;rnunsigned char *retiredate;rnlong salary;rnlong annuity;rnunsigned char *areacode;rnunsigned char *companyid;rnlong personaltype;rnicc_personal;rnrn这是pb的调用声明rnFUNCTION INT IC_Personal (INT FlagOp, ICC_ENV iccenv, REF ICC_Personal data) Library "iccinter.DLL"rnFUNCTION INT IC_OpenSession (REF ICC_ENV iccenv) Library "iccinter.DLL"rnFUNCTION INT IC_CloseSession (REF ICC_ENV iccenv) Library "iccinter.DLL"rnrndelphi中应该如何声明,调用?
调用C DLL的问题
各位DX好,小弟在用VB调用C写的DLL时,出现问题.rnDLL中的函数是:int WINAPI Open_COMPORT(unsigned char baud1[],int ComNo,int Data)rn我在调用时,这个unsigned char baud1[]该怎么样传值进去呢?
调用C的dll问题
我有个C的dll,现使用delphi来调用它,编译通过,运行时出现异常,请高手指点?rnC的dll中有如下函数:rnint SendSingle(const int nNeedReply,rn const int nMsgLevel,rn const char *sServiceID,rn const int nMsgFormat,rn const char *sFeeType, rn const char *sFeeCode,rn const char *sValidTime,rn const char *sAtTime,rn const char *sChargeTermID,rn const char *sDestTermID,rn const char *sReplyPath,rn const int nMsgLen,rn const char *sMsgContent,rn char *sMsgID, rn int *nErrorCode);rnrn在delphi中声明如下:rnfunction SendSingle(const nNeedReply:integer;rn const nMsgLevel:integer;rn const sServiceID:pchar;rn const nMsgFormat:integer;rn const sFeeType:pchar;rn const sFeeCode:pchar;rn const sValidTime:pchar;rn const sAtTime:pchar;rn const sChargeTermID:pchar;rn const sDestTermID:pchar;rn const sReplyPath:pchar;rn const nMsgLen:integer;rn const sMsgContent:pchar;rn sMsgID:string; rn nErrorCode:pointer):integer;stdcall;external 'AA.dll';rn然后定义变量: rn //定义数据类型rn nNeedReply:integer;rn nMsgLevel :integer;rn sServiceID:string;rn nMsgFormat:integer;rn sFeeType :string;rn sFeeCode :string;rn sValidTime:string;rn sAtTime :string;rn sChargeTermID:string;rn sDestTermID:string;rn sReplyPath :string;rn nMsgLen:integer;rn sMsgContent:string;rn sMsgID:string;rn nErrorCode:integer; rnrn对各个值赋值处理;rn
关于DLL编写的问题
目前介绍用VFP编制DLL的文章很少,请教高手们介绍关于DLL编写的问题rnrn我要创建一个DD2009.DLL文件,里面有一个函数:FindPortrnrn调用函数方式如下:rnrndeclare integer FindPort in DD2009.DLL integer, string @rnrnpublic devicepath, retrndevicepath = SPACE(260)rnret = FINDPORT(0,@DEVICEPATH)rnrnif ret<>0rnrn.................rnrnendirnrn如何实现这种调用方法。DLL文件如何编制。谢谢!rn
关于编写DLL的问题
用VS2005写的dll,以供其它语言调用,需要注意什么?
关于编写DLL的问题.
最近作一个项目, 需要用到DLL,我以前从未接写过DLL(只是听说过,了解一些基础知识),给为能不能介绍一些这方面的具体实例(小一点的就可以),或者给一些这方面的电子文档(最好有大量的实例)?我看了一点这方面的介绍,感觉就是没有一些基础的实例源码.谢谢!!
调用C++编写的dll的问题
有一个VC的DLL,函数说明如下:rnBOOLEAN Tuc_EnumTouchScreen(rnOUT PCHAR *paths,rnOUT INT &countrn);rnrnpathsrn[out]设备路径数组。rnHandlern[out]设备个数。rnrn========================rnC++调用范例:rnINT deviceCount = 0;rnPUCHAR devicePaths[64] = 0;rnfor (int i=0; i<64; i++)rnrn devicePaths[i] = new char[256];rn ZeroMemory(devicePaths[i],256);rnrnTuc_EnumTouchScreen(devicePaths, deviceCount);rnrnrn在DELPHI中,应该如何声明?rn我现在是这样声明:rnfunction Tuc_EnumTouchScreen(out paths:PChar;out Handle:Integer):Boolean;stdcall; external 'TucLib.dll' name 'Tuc_EnumTouchScreen'; rnrn调用是这样:rnprocedure TForm1.Button1Click(Sender: TObject);rnvarrn I,count:Integer;rn paths: array[0..63] of PChar;rnbeginrn for I := 0 to 63 dorn beginrn paths[I] := StrAlloc(256);rn end;rnrn Tuc_EnumTouchScreen(paths[0],count);rnend;rnrn运行提示,无法定位dll程序输入点,请问高手,应该如何声明和调用。
相关热词 c# stream 复制 android c# c#监测窗口句柄 c# md5 引用 c# 判断tabtip 自己写个浏览器程序c# c# 字符串变成整数数组 c#语言编程写出一个方法 c# 转盘抽奖 c#选中treeview