| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 704 人关注过本帖
标题:vb调用C++DLL,声明API时吃不准应该怎样声明那个函数变量
只看楼主 加入收藏
duolaijin
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-10-23
收藏
 问题点数:0 回复次数:0 
vb调用C++DLL,声明API时吃不准应该怎样声明那个函数变量
各位老师、朋友们好。
在学习VB时,想读取外部程序TStringGird的内容。
网上搜索后,好像VB代码无法直接读取,收索到有关的一个C++写的DLL.
想通过调用DLL的方式来完成读取任务。如果真能做到,也算是咱VB的学习有了点进步。
感觉困难的是API声明。其实在VB中已经学过一些API函数了,也基本懂得。

自己写不出的原因:看不懂C++的代码,不知道DLL中到底传递了那些变量,所以很晕,希望高人指导。
另外:我打开的外部程序上同时有两个TStringGird表格,通过vb枚举已经找到这两个表格的句柄。
     问:如何将VB找到的句柄传给DLL,让DLL按照句柄读取表格?
谢谢。
附:C++源码如下:


2)C++源码链接:http://bbs.
      代码作者:mjp1234airen4385
附:mjp1234airen4385代码如下
以前做个这个,不过是C++的,使用了hook方法。
你可以参考
下载完了,运行Exec这个程序,是TStringGrid的示例,运行EnumControls.exe,
点击【列举窗体中的控件】按钮,就获取了TStringGrid的句柄,
点击【复制SG中的数据】就可以把Exec这个程序中TStringGrid的数据复制到EnumControls.exe了。
核心代码是这个:
HWND DLLHWND;
    void __stdcall (*InstallHook)(HWND, HWND);
    void __stdcall (*UninstallHook)();
    char * __stdcall (*GetHookedCell)();

    DLLHWND = LoadLibrary("HookSG.dll");
    InstallHook = (void (__stdcall *)(HWND, HWND))GetProcAddress(DLLHWND, "InstallHook");
    UninstallHook = (void (__stdcall *)())GetProcAddress(DLLHWND, "UninstallHook");
    GetHookedCell = (char * (__stdcall *)())GetProcAddress(DLLHWND, "GetHookedCell");

    //AnsiString StrHwnd = SG->Cells[2][SelectedRow];
    //if (StrHwnd == "") return;
    //HWND hWnd = (void *)(StrHwnd.ToInt());
    //HWND hParent = GetParent(hWnd);

    //HWND hParent = FindWindow("TForm1", "列举窗体中的控件");
    //HWND hParent = FindWindow("TForm1", "Form1");
    //HWND hParent = FindWindow("TFrmSGHooked", "StringGrid to be hooked");
    char cText[MAX_PATH] = {0};
    strcpy(cText, Edit1->Text.c_str());
    if (strcmp(cText, "") == 0) return;
    HWND hParent = FindWindow(NULL, cText);
    HWND hWnd = FindWindowEx(hParent, 0, "TStringGrid", NULL);
    if (!hWnd) return;
    InstallHook(Handle, hWnd);
    SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);
    PostMessage(hParent, WM_NULL, 0, 0);

    for (int i = 0; i < 20; i++)
    {
        Sleep(100);
        Application->ProcessMessages();
        if (MsgWnd != 0) break;
    }
    if (MsgWnd == 0) goto Exit;

    int iRow, iCol, iLen;
    iRow = SendMessage(MsgWnd, CM_QUERYROW, 0, 0);
    iCol = SendMessage(MsgWnd, CM_QUERYCOL, 0, 0);
    if (iRow <= 0 || iCol <= 0) goto Exit;
    SGSub->RowCount = iRow;
    SGSub->ColCount = iCol;
    for (int i = 0; i < iRow; i++)
    {
        for (int j = 0; j < iCol; j++)
        {
            iLen = SendMessage(MsgWnd, CM_HOOKCELL, j, i);
            if (iLen < 0) goto Exit;
            SGSub->Cells[j][i] = GetHookedCell();
        }
    }

  Exit:
  MsgWnd = 0;
  UninstallHook();
  SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);
  FreeLibrary(DLLHWND);
搜索更多相关主题的帖子: 朋友 如何 网上 
2014-02-08 19:48
快速回复:vb调用C++DLL,声明API时吃不准应该怎样声明那个函数变量
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024316 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved