第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何從 cgo 獲取 ac 變量?

如何從 cgo 獲取 ac 變量?

Go
開滿天機(jī) 2022-05-18 13:37:09
package main/*#include <malloc.h>#include <windows.h>HDC *hdcArrBOOL CALLBACK EnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) {    for (int i = 0; i < (_msize(hdcArr) / sizeof(HDC)); i++) {        if (hdcArr[i] == NULL) {            hdcArr[i] = hdcMonitor;            break;        }    }    return TRUE;}void Init() {    int count = GetSystemMetrics(SM_CMONITORS);    hdcArr = (HDC*)malloc(sizeof(HDC) * count);    memset(hdcArr, 0, sizeof(HDC) * count);}HDC* GetHDC() {    return *hdcArr;}*/import "C"import (    "fmt"    "reflect"    "unsafe"    ".../w32")func main() {    var hdc w32.HDC    hdc = w32.GetDC(0)    C.Init()    w32.EnumDisplayMonitors(hdc, nil, reflect.ValueOf(C.EnumProc).Pointer(), 0)    t := (*[]w32.HDC)(unsafe.Pointer(&C.hdcArr))    cx := w32.GetDeviceCaps((*t)[0], w32.HORZRES)    fmt.Println(cx)}我寫了上面的源代碼。我想要的是將 cgo 的 HDC 數(shù)組導(dǎo)入到 w32.HDC 數(shù)組中,以了解每個(gè)監(jiān)視器的寬度和高度值。但是,如果您導(dǎo)入t: = (* [] w32.HDC) unsafe.Pointer (& C.hdcArr))并調(diào)用,則cx: = w32.GetDeviceCaps ((* t) [0], w32.HORZRES)僅返回 0。如何使用 cgo 查找多個(gè)顯示器的寬度和高度?
查看完整描述

1 回答

?
拉丁的傳說

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超8個(gè)贊

package main


/*

#cgo LDFLAGS: -lgdi32

#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>

#include <windows.h>

HDC *hdcArr;

int count;


BOOL CALLBACK EnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) {

    int i;

    for (i = 0; i < (_msize(hdcArr) / sizeof(HDC)); i++) {

        if (hdcArr[i] == NULL) {

            hdcArr[i] = CreateCompatibleDC(hdcMonitor);

            break;

        }

    }

    return TRUE;

}

void Init() {

    count = GetSystemMetrics(SM_CMONITORS);

    hdcArr = (HDC*)malloc(sizeof(HDC) * count);

    memset(hdcArr, 0, sizeof(HDC) * count);

}

*/

import "C"


import (

    "fmt"

    "reflect"

    "unsafe"


    "github.com/JamesHovious/w32"

)


func main() {

    C.Init()

    hdc := w32.GetDC(0)

    w32.EnumDisplayMonitors(hdc, nil, reflect.ValueOf(C.EnumProc).Pointer(), 0)

    w32.ReleaseDC(0, hdc)

    t := (*[256]w32.HDC)(unsafe.Pointer(C.hdcArr))[:C.count:C.count]

    for _, dc := range t {

        cx := w32.GetDeviceCaps(dc, w32.HORZRES)

        fmt.Println(cx)

        w32.DeleteDC(dc)

    }

    C.free(unsafe.Pointer(C.hdcArr))

}

對(duì)您來說理解這一點(diǎn)非常重要,指向 C 數(shù)組的指針只是一個(gè)內(nèi)存地址,沒有任何有關(guān)大小的信息(因此您的 t 數(shù)組為空)。這就是為什么你必須先把它轉(zhuǎn)換成一個(gè)大數(shù)組(*[256]w32.HDC),然后再把它切成合適的大小[:C.count:C.count]


這就是為什么我創(chuàng)建了count一個(gè)全局變量。


您遇到的另一個(gè)問題是傳遞給的 hdc 句柄EnumProc僅在回調(diào)中有效。要使它們?cè)诨卣{(diào)范圍之外永久可用,您必須調(diào)用CreateCompatibleDC(hdcMonitor);.

要將此功能與 cgo 一起使用,您必須通過以下方式包含 lib gdi32#cgo LDFLAGS: -lgdi32


一旦你用完這些 DC,你必須再次釋放它們w32.DeleteDC(dc)


也不要忘記釋放你的 malloced 數(shù)組C.free(unsafe.Pointer(C.hdcArr))


我的建議:每當(dāng)您使用 WinApi 時(shí),請(qǐng)仔細(xì)閱讀 msdn 文檔。這需要一些時(shí)間,但可以為您省去很多麻煩


您也可以在沒有 cgo 的情況下完全在 golang 中執(zhí)行此操作:


package main


import (

    "fmt"

    "syscall"


    "github.com/JamesHovious/w32"

)


func EnumProc(hMonitor w32.HMONITOR, hdcMonitor w32.HDC, lprcMonitor *w32.RECT, dwData w32.LPARAM) uintptr {

    fmt.Println(w32.GetDeviceCaps(hdcMonitor, w32.HORZRES))

    return w32.TRUE

}


func main() {

    hdc := w32.GetDC(0)

    w32.EnumDisplayMonitors(hdc, nil, syscall.NewCallback(EnumProc), 0)

    w32.ReleaseDC(0, hdc)

}

甚至更平滑:


func EnumProc(hMonitor w32.HMONITOR, hdcMonitor w32.HDC, lprcMonitor *w32.RECT, dwData w32.LPARAM) uintptr {

    horzres := lprcMonitor.Right - lprcMonitor.Left

    fmt.Println(horzres)

    return w32.TRUE

}


func main() {

    w32.EnumDisplayMonitors(nil, nil, syscall.NewCallback(EnumProc), 0)

}


查看完整回答
反對(duì) 回復(fù) 2022-05-18
  • 1 回答
  • 0 關(guān)注
  • 124 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)