中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
C語言的DLL怎么給VB返回String(char*)呢

這個問題很少有資料可以搜索得到,主要是因為現(xiàn)在的程序員要么是C/C++,要么VB(.NET),

即有一種鐘愛的語言.跟羅sir交流了一下,羅sir是C#骨灰級玩家,專攻網絡開發(fā),他認為DLL

加載到exe里成為一個模塊,不能對上一級的變量賦值.

除了我這種患有代碼癡迷癥的人,不會有人去研究這個問題了,經過幾天研究,發(fā)現(xiàn)了一些

竅門,最近又遇上用它的地方,所以干脆發(fā)達這里來,希望對大家有所幫助:

先介紹一個API,(Windows API主要是C語言的代碼):

GetWindowText

GetWindowText(Byval hwnd As Long,Byval lpTitle As String,Byval sz As Long)

函數(shù)會把對應窗口的標題(文本)賦值給lpTitle,也就是說DLL是可以操作exe的變量的,DLL

屬于exe就應當有exe賦予權利,娶個老婆回家,飯不給吃,錢不給用,所有東西不能動,這是哪家

哲學?好,我們現(xiàn)在來自己搞一個API,來給VB返回一個字符串:

.Code

Cpp代碼
  1. #include "stdafx.h"http://#include <windows.h>  
  2.   
  3. #define INSERT_API extern "C" _declspec(dllexport)  //定義接口宏定義  
  4.   
  5. BOOL APIENTRY DllMain( HANDLE hModule,   
  6.                        DWORD  ul_reason_for_call,   
  7.                        LPVOID lpReserved  
  8.                      )  
  9. {  
  10.     return TRUE;  
  11. }  
  12.   
  13. INSERT_API long __stdcall GetFileName(char *lpString,char lpResult[],long lngCount)  
  14. {   char *bytPos = lpString;                        //當前判斷的指針  
  15.     char *bytGet = 0;       //分隔符的位置  
  16.     //if(*(lpString + 1) != ':') return 0x0000000F;  
  17.     if(*(lpString + 1) != 58) return 0x0000000F;      
  18.         //必須是 X:/..../XXXX.XXX  
  19.     if (*(lpString + 2) != '//') return 0x000000F0;  
  20.     char chrTemp = *(bytPos);                       //臨時字符  
  21.     while(chrTemp)  
  22.     {   if(chrTemp == '//') bytGet = bytPos;  
  23.         bytPos++;chrTemp = *(bytPos);  
  24.     }  
  25.     if(*(bytGet + 1) == NULL) return 0x00000F00;    //C:/Windows/ 不帶文件名  
  26.     long k;  
  27.     for(k = 0;k <= lngCount - 1;k++)  
  28.     {   chrTemp = *(++bytGet);  
  29.         if(chrTemp) {lpResult[k] = chrTemp;}else{break;}  
  30.     }  
  31.     return k;  
  32. }  

在.Def文件中添加這個函數(shù)名(前面有過VB,VC混合編程第一步的介紹),然后VB里面這樣引用(這里最關鍵):

[Private/Public] Declare Function GetFileName Lib "XXX.DLL" (Byval lpString As String,Byval lpResult As String, _

Byval lngCount As String) As Long

然后就是緩沖區(qū),底層開發(fā)除了要面對 [藍屏] 就是 [崩潰],沒有給變量緩沖區(qū)可能造成內存不能為Read的錯誤

Dim s As String,ss As String * 256

Rem 如果上面沒有定長可以用 ss = space(256) 或者 ss = String(...)

s = "C:/windows/system32/shell32.dll"

Dim l As Long

l = GetFileName(s,ss,256)

ss = left(ss,l)

一個山寨版的 GetWindowText 就是這樣了

關于//可能還有人問,前面有關于正則表達式的文章,看下就Okay了,就當前的問題,幾個小地方要注意

VB跟C#累似(應該說C# 是vb和C/C++中走來),消去了指針,不要嘗試給VB返回任何指針,VB可以用

AddressOf給一個API過程傳遞地址

VB的String和Byte數(shù)組是一個性質,API其實怎么聲明無所謂,變量名本身是為了引用,傳遞的只是數(shù)

據(jù)類型

返回k的意義:

VB如果用space開辟緩沖區(qū),trim了也就無所謂了,但是C/C++不同,就算你給下個元素賦值為NULL

字符串結束了,但是fwrite等函數(shù)還是會把整個數(shù)組搞進文件,所以返回k來確定字符竄的長度是很有

必要的

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
vc vb dll 參數(shù)傳遞
VB開機運行程序
創(chuàng)建和刪除快捷方式
VB解壓縮帶密碼RAR文件的兩者方法
【黒客編程】VB木馬也瘋狂
如何用VB建立快捷方式
更多類似文章 >>
生活服務
熱點新聞
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服